Kotlin函数引用是否有一个简单的空安全运算符?
我想在可为null的对象上传递函数引用。以安卓系统为例,假设我想使用Kotlin函数引用是否有一个简单的空安全运算符?,kotlin,Kotlin,我想在可为null的对象上传递函数引用。以安卓系统为例,假设我想使用Activity#onBackPressed来自该Activity的子片段 如果我想调用这个函数,我可以很容易地做到 activity?.onBackPressed() 但是,假设我想将其作为参考: val onBackPressedRef = activity::onBackPressed 这会产生常见的空安全错误只允许安全或非空关联调用… 我可以通过以下方式消除错误,但是使用显然不理想: val onBackPress
Activity#onBackPressed
来自该Activity的子片段
如果我想调用这个函数,我可以很容易地做到
activity?.onBackPressed()
但是,假设我想将其作为参考:
val onBackPressedRef = activity::onBackPressed
这会产生常见的空安全错误只允许安全或非空关联调用…
我可以通过以下方式消除错误,但是使用
代码>显然不理想:
val onBackPressedRef = activity!!::onBackPressed
尝试活动?::onBackPressed
是我的第一本能,但这也会因为几个错误而中断,解释器似乎感到困惑
val onBackPressedRef = activity?.let { it::onBackPressed }
最后一个变体可以工作,但它比仅仅使用?:
要难看得多。我查了所有能找到的文件,但我觉得我遗漏了什么。有什么想法吗?你说得对,科特林没有?:
接线员。
您有几种选择:
1. <代码>让
和运行
因此,必须使用辅助函数。您也可以使用run()
,而不是let()
,使表达式稍微短一点:
val onBackPressedRef = activity?.let { it::onBackPressed }
val onBackPressedRef = activity?.run { ::onBackPressed }
但请记住,无论哪种方式,调用都会更加冗长:
onBackPressedRef?.invoke(args)
因此,您应该问问自己,这是否真的是您想要的,或者是否也可以接受无操作函数调用
2.闭包
您可以使用闭包--但这将改变语义:
val onBackPressedRef = { activity?.onBackPressed() }
在这里,onBackPressedRef
不再为null,因此您可以使用()
操作符调用它,在null活动
的情况下,它将无效
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()