【问题标题】:Kotlin coroutine won't compile without delay (suspend function?)Kotlin 协程不会立即编译(挂起函数?)
【发布时间】: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。

标签: multithreading kotlin concurrency coroutine kotlin-coroutines


【解决方案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。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 2019-05-30
  • 2018-05-31
  • 1970-01-01
  • 2018-01-10
  • 2021-01-04
相关资源
最近更新 更多