我正在尝试在Kotlin中定义一个接受两个参数的回调方法。如何在变量中为实际函数调用声明lambda?
// actual method
fun foo(a : String, b : String) {
// do something
}
// syntax error here
val callback : (String, String) -> Unit = foo(a, b)
// invoke method
callback.invoke("a", "b")
答案 0 :(得分:2)
fun foo(a : String, b : String) {
// do something
}
val callback : (String, String) -> Unit = ::foo
// or val callback = { a: String, b: String -> foo(a, b) }
fun main() {
callback.invoke("a", "b")
}
答案 1 :(得分:2)
您在这里所做的就是尝试将单元称为(String, String) -> Unit
。除了不存在的变量外,调用函数时还会得到一个Unit。
如果您熟悉Java(稍微更容易理解),则可以:
void foo(String a, String b) { ... }
BiConsumer consumer = foo(a, b);
这是不允许的,因为对于Java,BiConsumer是无效的。同样地,在您的情况下,(我不记得这些函数的名称,但这有点像)KFunction2不是单位。
要获取实际的方法引用,您需要使用::
。通过在Java或Kotlin中使用.
,您调用该函数;您没有返回函数本身,我认为这是您的意图。
val callback: (String, String) -> Unit = ::foo
与Java不同,您不需要在运算符的左侧添加任何内容。如果以后需要确定方法的范围(即在实例中),则可以将其放在左侧:
var someClassWithAFunction = ....
var callback: (String, String) -> Unit = someClassWithAFunction::foo
但是,目前,超出问题范围的使用细节还不太重要。
一旦有了方法引用,就可以像常规函数一样调用它(分配时最初做的是-callback(...)
)。但是,您需要使用函数将其范围限定为有效的语法,但是我假设您已经在这样做,并且只是为了MCVE,它是按原样编写的。