Kotlin协程将delay定义为具有关键字suspend的挂起函数,因此

  • 调用delay作为main的直接子语句不是 允许,因为main不是挂起函数
  • 作为runBlockinglaunch岁的子元素拨打delay是允许的,因为那些 函数创建了一个协程作用域.

编译器如何知道这一点?关键字suspend是语言本身的一部分,而runBlockinglaunch和库 routine 作用域的概念是通过kotlinx.couroutines库添加的.由于上面概述的语法判断大概不依赖于该特定实现,它是如何工作的呢?

推荐答案

请记住,在大多数情况下,如果我们创建一个新的"作用域"或"块"代码,所以我们使用{ ... },例如:

listOf(1).forEach { ... }
runCatching { ... }
run { ... }

然后从技术上讲,我们调用一个向其传递lambda的函数.我们调用的函数指定我们传递的lambda的类型.例如,runCatching()被定义为:

public inline fun <R> runCatching(block: () -> R): Result<R> {

让我们来看看runBlocking():

public actual fun <T> runBlocking(context: CoroutineContext, block: suspend CoroutineScope.() -> T): T {

你看到block这个参数有什么不同吗?它被标记为suspend.这意味着runBlocking()希望我们将一个挂起的lambda传递给它,这样编译器就可以知道我们处于挂起的上下文中.

请阅读以了解更多信息:Higher-order functions and lambdas

Kotlin相关问答推荐

如何修改muableStateMapOf的值?

在协程上下文中重新抛出异常

Kotlin 接口类型参数

Kotlin 中的 maxOf() 和 max() 方法有什么区别?

按钮无法在 Android Studio 上打开新活动

jlink:在合并模块和 kotlin.stdlib 中打包 kotlin.*

判断 Kotlin 变量是否为函数

kotest 更改环境变量

Kotlin 中获取类简单名称的最佳实践

如何使用 Android CameraX 自动对焦

listOf() 返回 MutableList

如何使用 gradle 脚本 Kotlin 构建文件构建可运行的 ShadowJar?

下拉通知面板时是否可以暂停Android中的任何视频(媒体播放器)应用程序?

如何在 Kotlin 中为变量设置监听器

在 Kotlin 函数上使用 Mokito anyObject() 时,指定为非 null 的参数为 null

如何使用mockk库模拟android上下文

可以在函数参数中使用解构吗?

Java的Kotlin:字段是否可以为空?

Android Compose 生产准备好了吗?

如何在 kotlin 中创建重复对象数组?