web-dev-qa-db-ja.com

Kotlinラムダのvarargパラメータ

関数f()を次のように定義したいと思います。

_val f: (vararg strings: String) -> Unit = { for (str in it) println(str) }
_

f("a","b","c")で呼び出すことができます。上記のf()の定義の場合、vararg修飾子(Kotlin v。1.3.60)を指すコンパイルエラーが発生します。

_Unsupported [modifier on parameter in function type]
_

varargパラメータを受け入れるラムダをどのように定義できますか?

15
David Soroko

これは不可能だと思います。以下は、varargを使用した関数のタイプを示しています。 varargパラメータはArrayで表されます:

fun withVarargs(vararg x: String) = Unit

val f: KFunction1<Array<out String>, Unit> = ::withVarargs

この動作は docs でも提案されています。

関数内では、タイプTのvarargパラメータはTの配列として表示されます。つまり、上記の例のts変数はタイプArray<out T>を持っています。

したがって、例ではArray<String>を使用する必要がありました。関数をラムダとして記述する代わりに、varargを使用できる通常の関数を使用して、必要に応じて呼び出しを外観にすることができます。

fun f(vararg strings: String) = strings.forEach(::println)

f("a","b","c")
6
s1m0nw1