Сопрограмма Kotlin не будет компилироваться без задержки (функция приостановки?) - PullRequest
0 голосов
/ 04 июня 2019

Я просматривал примеры сопрограмм Kotlin и играл с этим примером.

fun main() = runBlocking {
    GlobalScope.launch {
        repeat(1000) {i->
            println("I'm sleeping $i ...")
            delay(500)
        }
    }
    delay(1300)
}

Он работает, как и ожидалось, печатая 3 раза и заканчивая.Однако если последняя строка, задержка (1300), будет удалена, программа не будет распознавать основную функцию и не будет компилироваться.Почему это так?

Замена последней строки на println () по-прежнему компилируется, но печатается только один раз.

1 Ответ

1 голос
/ 04 июня 2019

Это происходит из-за типов возврата.

main функция должна возвращать Unit тип.

В Kotlin

Мы можем явно вернуть значениеиз лямбда с использованием квалифицированного синтаксиса возврата. В противном случае неявно возвращается значение последнего выражения.

См. Возвращение значения из лямбда-выражения

Если при вызове delay удален тип возвращаемой внешней лямбды (runBlocking), изменился на Job (launch возвращаемое значение функции) и main также возвращает Job.

То есть он не запускается

fun main() = runBlocking {
    GlobalScope.launch {
        repeat(1000) {i->
            println("I'm sleeping $i ...")
            delay(500)
        }
    }
    delay(1300) // returns Unit, runBlocking also returns Unit and so does main
}

С удалением delay:

fun main() = runBlocking {
    GlobalScope.launch {
        repeat(1000) {i->
            println("I'm sleeping $i ...")
            delay(500)
        }
    } // returns Job, runBlocking also returns Job and so does main
}
...