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) 返回类型更改为 Joblaunch 函数的返回值)并且 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 挂起函数 )

Kotlin 协程中的挂起函数是啥意思?

Kotlin 协程协程的挂起和恢复 ② ( 协程挂起 和 线程阻塞 对比 )

Kotlin 协程协程的挂起和恢复 ② ( 协程挂起 和 线程阻塞 对比 )