Как мне вызвать функцию класса, у которой есть получатель? - PullRequest
0 голосов
/ 08 февраля 2019

Как вызвать публичную функцию расширения для класса, у которого есть получатель?

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 голосов
/ 08 февраля 2019

Да, это возможно.

Описанная вами функция , как говорят, имеет два приемника , отправку приемник типа CoroutineActivity и добавочный приемник типа CoroutineScope.

Хотя нет синтаксиса для вызова этой функции путем непосредственного предоставления двух получателей, она может вызываться в области видимости своего типа приемника (то есть в области, где this: CoroutineActivity).Это следующие области:

В подходящем объемеВы можете просто вызвать функцию в экземпляре CoroutineContext.

Самый простой способ сделать это - использовать стандартные функции определения объема библиотеки run { ... } или apply { ... }, передав лямбду с получателем следующим образом:

coroutineActivity.run { 
    val onCreateScope = CoroutineScope(Dispatchers.Main + Job())
    onCreateScope.onCreate(savedInstanceState)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...