私はKotlinで関数型プログラミングを採用しようとしています。可能であれば、可変のvarsの使用は避けてください。通常、ユニット返す関数のad hocテストでは、関数内で何かが正常に機能しているかどうかを確認するために、ちょうどprintln()
があります。しかし、このテストでは、文字列を累積して、最終的にassertEquals(...)
を使用する必要があります。コトリンのユニット機能内に蓄積する機能的な方法は?
いつものように、囲いの範囲でvar
と宣言し、+=
を使ってそれに蓄積しています。 関数を渡したり連鎖したり、変更可能なvarを削除したりすることで、より機能的な方法がありますか?は、ここではいくつかの単純化されたが、説明のコードです:
inline fun <T> Iterable<T>.forEachFrom(beg:Int, act:(T)->Unit) {
var i=0; if (beg>=0) for (e in this) if (i++ >= beg) act(e)
}
fun main(args:Array<String>) {
val l = listOf("zero", "one", "two", "three", "four")
// print-to-screen test
l.forEachFrom(2){print("$it-")}; println()
// output: two-three-four-
// accumulate-in-var test
var s = ""
l.forEachFrom(2){s += "$it-"}; println(s)
// output: two-three-four-
// Is there a purely functional way, without declaring a mutable var?
// val s = l.forEachFrom(2){accumulator???("$it-")}
// - OR -
// val s = l.forEachFrom(2).accumulator???("$it-")
// println(s)
}
おかげで...私はおそらくより良いforEachFrom exampが出ているはずですル。 :)私はその関数を改良しようとはしていませんが、純粋に機能的な方法でユニット返す関数内にテスト文字列を蓄積できるかどうかをもっと理解しようとしています。私はテストを書くために必要な、より複雑な 'Unit'を返す関数をたくさん持っています。ここで 'var s'の良い選択肢がないかどうかについて、私の心を引き伸ばすことは、もっと練習です。 – sirksel
@sirksel、基本的に、機能的なスタイルで状態を蓄積するには、通常、* fold *イディオムを使用します(['fold'拡張機能があります)(https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections /fold.html)をKotlinに掲載)。 – hotkey
@sirksel、上記の関数を 'fold'で実装した例です:[(gist)](https://gist.github.com/h0tk3y/20f7985c79f746e91312e375de571dbb) – hotkey