我正在浏览Kotlin协程示例,并在玩这个示例。
fun main() = runBlocking {
GlobalScope.launch {
repeat(1000) {i->
println("I'm sleeping $i ...")
delay(500)
}
}
delay(1300)
}
它像预期的那样工作,打印3次并终止。如果删除最后一行delay(1300),该程序将无法识别主要功能并且无法编译。为什么会这样?
用println()替换最后一行仍然可以编译,但是只能打印一次。
答案 0 :(得分:1)
发生这种情况的原因是返回类型。
main
函数应返回Unit
类型。
在科特林
我们可以使用限定的返回语法从lambda显式返回一个值。 否则,将隐式返回最后一个表达式的值。
请参见Returning a value from a lambda expression
如果delay
调用删除了外部lambda的(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
}