Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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,如何对具有接收器的类调用公共扩展函数 interface CoroutineActivity { // how can I call this function in example below? fun CoroutineScope.onCreate(savedInstanceState: Bundle?) } class CoroutineActivityDelegate(private val coroutineActivity: CoroutineActivity)

如何对具有接收器的类调用公共扩展函数

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作为接收器,而不是第一个参数

是的,这是可能的

您描述的函数是CoroutineActivity类型的分派接收器和CoroutineScope类型的扩展接收器

虽然没有通过直接提供两个接收器来调用此函数的语法,但可以在其dispatch receiver类型的范围内调用此函数,即在以下范围内调用:CoroutineActivity。这些范围包括:

CoroutineActivity及其子类型的成员范围; 具有CoroutineActivity类型或其子类型的扩展接收器的扩展范围; CoroutineActivity类型的作用域或其子类型。 在合适的范围内,您可以简单地在CoroutineContext实例上调用该函数

最简单的方法是使用标准库作用域函数运行{…}或应用{…},将lambda传递给接收方,如下所示:

coroutineActivity.run { 
    val onCreateScope = CoroutineScope(Dispatchers.Main + Job())
    onCreateScope.onCreate(savedInstanceState)
}