如何调用具有接收器的类的函数?

时间:2019-02-07 22:26:28

标签: kotlin

如何在具有接收者的类上调用公共扩展功能?

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

1 个答案:

答案 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)
}