【问题标题】:How to assign a null value to a function type variable in Kotlin?如何将空值分配给 Kotlin 中的函数类型变量?
【发布时间】:2014-04-03 08:44:33
【问题描述】:

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

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

我目前的解决方案是确保回调具有默认实现。

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

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

【问题讨论】:

    标签: function function-pointers kotlin


    【解决方案1】:

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

    var callback1 : (() -> Unit)? = null
    var callback2 : (((a) -> c, b) -> Unit)? = null
    

    您通常需要在整个函数类型声明周围加上括号。即使它不是必需的,它也可能是一个好主意。您还需要使用带有 null 安全运算符的 invoke 调用该函数:

    callback1?.invoke()
    

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

    确定回调是否已设置而不允许空值的一种方法是使用null object pattern

    val UNSET_CALLBACK1: () -> Unit = {}
    var callback1 : () -> Unit = UNSET_CALLBACK1
    fun callback1IsSet(): Boolean {
        return callback1 !== UNSET_CALLBACK1
    }
    

    希望这会有所帮助!

    【讨论】:

    • 当我调用可空引用函数时,我看到错误`明确使用?.invoke() 任何解决方案?
    • 这很有意义。 blah?.invoke() 的意思是“如果 blah 不为空,则调用 blah”,如果 blah 可以为空,这是必要的。解决方案就是这样做。我会更新答案以澄清这一点。
    猜你喜欢
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    • 2022-01-18
    相关资源
    最近更新 更多