我刚刚了解了 kotlin 中的带标签返回,并编写了这个代码示例,其中我将 lambda 传递给了 with
,还有另一个 lambda 传递给 forEach
我试图从 with
返回内forEach
,由于某种原因编译器崩溃,这是代码:
fun main(args: Array<String>) : Unit {
val l = listOf(listOf(1,2,3), listOf(4,5,6))
val t = label@ with(l) {
get(0).forEach {
return@label 2
}
}
println(t)
}
在 Kotlin 中应该允许这样做吗?这是编译器错误吗?
最佳答案
请注意,如果您只想从 with
返回你应该使用 return@with
反而。
所以你的代码应该看起来像:
fun main(args: Array<String>) : Unit {
val l = listOf(listOf(1,2,3), listOf(4,5,6))
val t = with(l) {
get(0).forEach {
return@with 2
}
}
println(t)
}
是的...它会返回
2
那么.. 你也可以使用 return@forEach
如果您只是想从 forEach
返回...如果您真的想改用自己的标签,请确保将其放在左花括号之前(没有空格(另请参阅 Kotlin coding convention regarding lambda formatting )),例如:
fun main(args: Array<String>) : Unit {
val l = listOf(listOf(1,2,3), listOf(4,5,6))
val t = with(l) label@{
get(0).forEach {
return@label 2
}
}
println(t)
}
另请注意:如果它是
for
, while
,或任何地方 continue
或 break
可以使用,然后您实际上将标签放在前面(请参阅 Kotlin reference # Break and Continue Labels ),例如:lambda@ for (i in 1..3) {
break@label
}
最后:尽量省略自己的标签。大多数时候你并不真正需要它们......而且可能重复使用现有的 return@labels 就足够了。另请检查 Kotlin coding conventions, e.g. returns in lambda
关于kotlin - 你能在 kotlin 中返回@label 一些值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52184029/