Kotlin 协程不会立即编译(挂起函数?)
Posted
技术标签:
【中文标题】Kotlin 协程不会立即编译(挂起函数?)【英文标题】:Kotlin coroutine won't compile without delay (suspend function?) 【发布时间】:2019-10-20 08:49:21 【问题描述】:我正在浏览 Kotlin 协程示例,并且正在玩这个示例。
fun main() = runBlocking
GlobalScope.launch
repeat(1000) i->
println("I'm sleeping $i ...")
delay(500)
delay(1300)
它像预期的示例一样工作,打印 3 次并终止。但是,如果最后一行 delay(1300) 被删除,程序将无法识别主函数并且无法编译。这是为什么呢?
用 println() 替换最后一行仍然可以编译,但只打印一次。
【问题讨论】:
你使用的协程模块是什么版本的? 我使用的是 1.2.1。 【参考方案1】:这是因为返回类型。
main
函数应该返回 Unit
类型。
在 Kotlin 中
我们可以使用限定返回语法从 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
【讨论】:
有意义 :) 如果你从runBlocking
返回一个字符串,你会得到一个错误说 main should return a unit
。谢谢。以上是关于Kotlin 协程不会立即编译(挂起函数?)的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin 协程协程启动 ③ ( 协程组合并发 | 挂起函数串行执行 | 协程组合并发执行挂起函数 )
Kotlin 协程协程的挂起和恢复 ① ( 协程的挂起和恢复概念 | 协程的 suspend 挂起函数 )
Kotlin 协程协程的挂起和恢复 ① ( 协程的挂起和恢复概念 | 协程的 suspend 挂起函数 )