【问题标题】:How to use the eivls operator with a nullable lambda parameter?如何将 eivls 运算符与可为空的 lambda 参数一起使用?
【发布时间】:2020-02-23 23:51:22
【问题描述】:

我有一个可以为空的 lambda 参数定义为的函数 -

fun download_a_file(callback_after_download_is_complete: (() -> Any)? = null)
    {
        // ... do things ...
    }

想法是,文件下载后,调用函数的人可以传递一个lambda函数,在文件下载后执行一些代码。

该参数为空,因为有人可能不希望下载 lambda。

所以在 download_a_file function 里面我有这个代码 -

if( callback_after_download_is_complete != null)
    callback_after_download_is_complete()

有效,但不优雅。如果可以的话,我宁愿在这里使用猫王运算符。 但是,我没有找到任何关于如何使用 elvis 运算符调用可为空的 lambda 参数的好的参考资料。你能做到吗?如果是这样 - 怎么样?

【问题讨论】:

    标签: kotlin operator-keyword nullable


    【解决方案1】:

    如果您注意到,您不能直接调用匿名可为空的函数:

    Reference 有一个可为空的类型 '(() -> Any)?',使用显式 '?.invoke()' 改为进行类似函数的调用

    所以你所要做的就是使用invoke/0:

    fun download_a_file(callback_after_download_is_complete: (() -> Any)? = null) {
      callback_after_download_is_complete?.invoke()
    }
    

    【讨论】:

    • 奇怪的是,当我直接调用该函数时,它实际上正在处理我的代码。但我会使用调用方法,看看会发生什么
    • 啊,我认为当我直接调用该函数时它对我的代码有效,因为它在空检查中。似乎编译器足够聪明,可以选择它。
    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 2018-08-07
    • 2016-06-28
    • 2011-12-24
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多