lambda中的vararg参数

时间:2017-12-31 21:50:37

标签: lambda kotlin

我想定义一个函数f(),如下所示:

val f: (vararg strings: String) -> Unit = { for (t in it) println(t) }

以便我可以使用f("a","b","c")调用它。对于f()的上述定义,我得到了编译错误(指向vararg修饰符):

Unsupported [modifier on parameter in function type]

如何定义接受vararg参数的lambda?

2 个答案:

答案 0 :(得分:6)

我担心这是不可能的。以下演示了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并使调用看起来符合要求的普通函数,而不是将您的函数编写为lambda:

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

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

答案 1 :(得分:1)

如果你需要一个函数指针(作为参数传递)。可以通过变通方法(hack)来实现:

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


val fWrapper:(Array<String>)-> Unit = {arr:Array<String>->f(*arr)}