Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin函数引用是否有一个简单的空安全运算符?_Kotlin - Fatal编程技术网

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

Kotlin函数引用是否有一个简单的空安全运算符?,kotlin,Kotlin,我想在可为null的对象上传递函数引用。以安卓系统为例,假设我想使用Activity#onBackPressed来自该Activity的子片段 如果我想调用这个函数,我可以很容易地做到 activity?.onBackPressed() 但是,假设我想将其作为参考: val onBackPressedRef = activity::onBackPressed 这会产生常见的空安全错误只允许安全或非空关联调用… 我可以通过以下方式消除错误,但是使用显然不理想: val onBackPress

我想在可为null的对象上传递函数引用。以安卓系统为例,假设我想使用
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()