Function 如何为Kotlin中的函数类型变量赋值?

Function 如何为Kotlin中的函数类型变量赋值?,function,function-pointers,kotlin,Function,Function Pointers,Kotlin,我有一个包含回调的变量,默认情况下它的值应该为null。但这种语法似乎不起作用 var callback1 : () -> Unit = null var callback2 : ((a) -> c, b) -> Unit = null 我目前的解决方案是确保回调具有默认实现 var callback1 : () -> Unit = { } var callback2 : ((a) -> c, b) -> Unit = { a, b -> } 然而,

我有一个包含回调的变量,默认情况下它的值应该为null。但这种语法似乎不起作用

var callback1 : () -> Unit = null
var callback2 : ((a) -> c, b) -> Unit = null
我目前的解决方案是确保回调具有默认实现

var callback1 : () -> Unit = { }
var callback2 : ((a) -> c, b) -> Unit = { a, b -> }

然而,这使得很难检查是否设置了回调,并且可能需要付出一些代价才能实现默认实现(是这样吗?)。如何为Kotlin中的函数类型变量分配空值?

与Kotlin中的所有变量一样,函数引用通常不能为空。为了允许空值,必须在类型定义的末尾添加一个
,如下所示:

var callback1 : (() -> Unit)? = null
var callback2 : (((a) -> c, b) -> Unit)? = null
通常需要在整个函数类型声明周围加上括号。即使它不是必需的,也可能是个好主意。您还需要使用null-safe运算符使用
invoke
调用函数:

callback1?.invoke()
从长远来看,不做任何事情的实现方法可能更方便,而且对我来说似乎更“kotlin-y”。与计算机科学中的大多数事情一样,我不会担心默认实现的性能成本,除非您有特定的性能数据表明这是一个问题

确定是否已在不允许空值的情况下设置回调的一种方法是使用:


希望这有帮助

当我调用可为null的引用函数时,我看到错误“显式地使用
?。invoke()
任何解决方案?这非常有意义
blah?.invoke()
的意思是“如果blah不为null,则调用blah”,如果blah可能为null,则这是必需的。解决办法就是这样做。我将更新答案以澄清这一点。
val UNSET_CALLBACK1: () -> Unit = {}
var callback1 : () -> Unit = UNSET_CALLBACK1
fun callback1IsSet(): Boolean {
    return callback1 !== UNSET_CALLBACK1
}