htu*_*y42 5 suspend kotlin kotlinx.coroutines
我对以下代码发生的事情感到困惑。task.yield 是一个从 a 到 b 的哈希映射,而 store.put 是一个挂起函数,它接受一个 a 和一个 b。第一种遍历地图的方法没有问题,第二种方法也是如此。第三种方式对我来说是最自然的迭代方式,也是我最初编写的方式,导致 kotlin 抱怨挂起函数只能在协程主体内调用。我猜这与地图上的 forEaching 如何工作有关(可能与列表相反?)但我真的不明白问题是什么。
launch{
// Kotlin is perfectly happy with this
for(elt in task.yield.keys){
store.put(elt,task.yield[elt]!!)
}
// and this
task.yield.keys.forEach {
store.put(it,task.yield[it]!!)
}
// This makes kotlin sad. I'm not sure why
task.yield.forEach { t, u ->
store.put(t, u)
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:我刚刚注意到 forEach 列表是一个内联函数,而我尝试使用的地图不是。我猜是这个问题。
实际上,Map#forEach接受 a (K, V) -> Unit(a BiConsumer<? super K, ?? super V>)的重载不是 Kotlin 标准库的一部分,而是 JDK 本身 ( Map#forEach) 的一部分。这解释了为什么在这个块内执行的任何东西都没有内联,因此不是封闭的“挂起上下文”的一部分。
Kotlin 提供了一个非常相似的函数,您可以使用它:
Run Code Online (Sandbox Code Playgroud)inline fun <K, V> Map<out K, V>.forEach(action: (Entry<K, V>) -> Unit)对每个条目执行给定的操作。
kotlin-stdlib / kotlin.collections / forEach
这接受一个Entry<K, V>,因此您可以简单地在 lambda 中对其进行解构:
task.yield.forEach { (t, u) /* <-- this */ ->
store.put(t, u)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3410 次 |
| 最近记录: |