gpt4 book ai didi

kotlin - Kotlin 函数引用是否有一个简单的空安全运算符?

转载 作者:行者123 更新时间:2023-12-05 01:14:42 29 4
gpt4 key购买 nike

我想在可空对象上传递函数引用。以 Android 为例,假设我想使用 Activity#onBackPressed来自作为该事件的子级的片段。

如果我想调用这个函数,我可以很容易地做到

activity?.onBackPressed()

但是,假设我想将其作为引用传递:
val onBackPressedRef = activity::onBackPressed

这给出了熟悉的空安全错误 只允许安全或非空断言调用...

我可以通过以下方式消除错误,但使用 !!显然不理想:
val onBackPressedRef = activity!!::onBackPressed

正在尝试 activity?::onBackPressed是我的第一直觉,但这也打破了几个错误,解释器似乎很困惑。
val onBackPressedRef = activity?.let { it::onBackPressed } 

最后一个变体有效,但它比仅使用 ?:: 要丑得多。 .我检查了我能找到的所有文档,但我觉得我错过了一些东西。有任何想法吗?

最佳答案

你说得对,没有?:: Kotlin 中的运算符。
您有几种选择:

1. letrun
因此,您必须使用辅助函数。而不是 let() ,您也可以使用 run() ,使表达式更短一点:

val onBackPressedRef = activity?.let { it::onBackPressed }
val onBackPressedRef = activity?.run { ::onBackPressed }

但请记住,无论哪种方式,调用也会更加冗长:
onBackPressedRef?.invoke(args)

因此,您应该问问自己,这是否真的是您想要的,或者是否也可以接受无操作函数调用。

2. 关闭

您可以使用闭包——但这会改变语义:
val onBackPressedRef = { activity?.onBackPressed() }

在这里, onBackPressedRef不再可以为空,因此您可以使用 () 调用它运算符,如果为空 activity它不会有任何影响。

3. 辅助功能

如果您经常遇到带有可为空对象的函数引用,您可以编写自己的小抽象:
// Return type: () -> Unit
fun <T> funcRef(obj: T?, function: T.() -> Unit) = { obj?.function() }

这为非空函数变量交换了不同的语法:
 // activity can be null
val onBackPressedRef = funcRef(activity, Activity::onBackPressed)

// Callable directly
onBackPressedRef()

关于kotlin - Kotlin 函数引用是否有一个简单的空安全运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58809080/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com