一般来说,suspend fun
s 不能代替正常的 fun
s。 如果尝试直接从普通fun
调用suspend fun
,则会出现编译时错误。
这篇博文提到,你可以通过编写
list.map { async { f(it) } }.map { it.await() }
为什么第二个map
编译? 您通常不能通过suspend fun
代替fun
。 是吗
map
是inline fun
,并且暂停会自动推断为"上游">map
是 Kotlin 以某种方式特例- 别的?
该地图是一种内联乐趣,并且暂停会自动推断为"上游">
是的。内联后检查暂停乐趣。我在文档中看不到对此的明确提及,但在协程 KEEP 中有一个:
注意:挂起 lambda 可能会在其代码的所有位置调用挂起函数,其中允许来自此 lambda 的非本地返回语句。也就是说,允许在内联 lambda 中挂起函数调用,如 apply{} 块,但在 noinline 中或交叉内联内部 lambda 表达式中都不允许。暂停被视为一种特殊的非本地控制转移。