为什么传递给 `launch` 函数的 `block` 参数类型同时标记为 `suspend` 和 `CouroutineScope` 上的扩展

问题描述 投票:0回答:1

根据官方文档,

launch
函数的函数签名如下

fun CoroutineScope.launch(
    context: CoroutineContext = EmptyCoroutineContext, 
    start: CoroutineStart = CoroutineStart.DEFAULT, 
    block: suspend CoroutineScope.() -> Unit
): Job

其中

block
参数标记为
suspend
CoroutineScope

上的扩展

Roman Elizarov 在文章中解释了为什么函数应该被标记为

suspend
或在
CourotineScope
上的扩展,但不能两者都标记。

文章摘录

如果您需要启动一个在函数返回后继续运行的协程,请使您的函数成为 CoroutineScope 的扩展或传递scope: CoroutineScope 作为参数,以便在函数签名中明确您的意图。不要让这些功能暂停

我的问题 - 为什么传递给协程构建器函数的 lambda 不是这种情况?

kotlin kotlin-coroutines
1个回答
0
投票

这意味着

suspend CoroutineScope.() -> Unit
挂起 lambda 只能从 CoroutineScope 调用。看一下这个 example,它解释了
coroutineScope
函数的机制及其语义。

© www.soinside.com 2019 - 2024. All rights reserved.