Как передать функцию приостановки в качестве явного параметра для сопрограммного конструктора? - PullRequest
5 голосов
/ 05 апреля 2020

Я смотрю на launch конструктор сопрограмм, который принимает код сопрограммы как block: suspend CoroutineScope.() -> Unit. Обычно мы передаем код как лямбда. Однако мне было интересно, как передать эту функцию в качестве явного параметра для запуска функции.

coroutineScope {
    launch(block = ::myFunction)
}

suspend fun CoroutineScope.myFunction(): Unit {
    // coroutine code
}

Это дает следующую ошибку

Type mismatch.
Required:
suspend CoroutineScope.() → Unit
Found:
KSuspendFunction0<Unit>

Что я пропускаю?

Ответы [ 2 ]

2 голосов
/ 05 апреля 2020

Синтаксис для ссылок на функции расширения такой же, как и для функций-членов:

launch(block = CoroutineScope::myFunction)
0 голосов
/ 05 апреля 2020

Как насчет этого?

coroutineScope {
    launch(block = myFunction())
}

fun myFunction(): suspend CoroutineScope.() -> Unit = {
    for(i in 3 downTo 1) {
        println("$i")
        delay(1000)
    }
}
...