是什么让 Iterable.map 与挂起函数一起工作



一般来说,suspend fun s 不能代替正常的 fun s。 如果尝试直接从普通fun调用suspend fun,则会出现编译时错误。

这篇博文提到,你可以通过编写

list.map { async { f(it) } }.map { it.await() }

为什么第二个map编译? 您通常不能通过suspend fun代替fun。 是吗

  • mapinline fun,并且暂停会自动推断为"上游">
  • map是 Kotlin 以某种方式特例
  • 别的?

该地图是一种内联乐趣,并且暂停会自动推断为"上游">

是的。内联检查暂停乐趣。我在文档中看不到对此的明确提及,但在协程 KEEP 中有一个:

注意:挂起 lambda 可能会在其代码的所有位置调用挂起函数,其中允许来自此 lambda 的非本地返回语句。也就是说,允许在内联 lambda 中挂起函数调用,如 apply{} 块,但在 noinline 中或交叉内联内部 lambda 表达式中都不允许。暂停被视为一种特殊的非本地控制转移。

最新更新