如何在具有接收者的类上调用公共扩展功能?
interface CoroutineActivity {
// how can I call this function in example below?
fun CoroutineScope.onCreate(savedInstanceState: Bundle?)
}
class CoroutineActivityDelegate(private val coroutineActivity: CoroutineActivity) {
fun onCreate(savedInstanceState: Bundle?) {
val onCreateScope = CoroutineScope(Dispatchers.Main + Job())
// how do I call an extension function with a receiver? This doesn't compile
coroutineActivity.onCreate(onCreateScope, savedInstanceState)
}
}
有可能吗?我希望CoroutineScope
成为接收者,而不是第一个参数
答案 0 :(得分:4)
是的,有可能。
您描述的函数is said to have two receivers,类型为CoroutineActivity
的 dispatch 接收器和类型为CoroutineScope
的 extension 接收器。
虽然没有通过直接提供两个接收方来调用此函数的语法,但是可以在其派发接收方类型的范围内(即this: CoroutineActivity
的范围内)调用该函数。这些范围是:
CoroutineActivity
成员及其子类型的作用域; CoroutineActivity
(或其子类型)的 extension 接收者的扩展范围; CoroutineActivity
(或其子类型)的function literals (lambdas) with a receiver的范围。在适当的范围内,您可以简单地在CoroutineContext
的实例上调用该函数。
最简单的方法是使用标准库作用域范围函数run { ... }
或apply { ... }
,向接收方传递一个lambda,如下所示:
coroutineActivity.run {
val onCreateScope = CoroutineScope(Dispatchers.Main + Job())
onCreateScope.onCreate(savedInstanceState)
}