我想定义一个函数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?
答案 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)}