我刚刚了解了Kotlin中的标签返回值,并编写了此代码示例,其中我将lambda传递给了with
,又有一个lambda传递给了forEach
,我试图从{{ 1}}位于with
内,由于某种原因,编译器崩溃了,下面是代码:
forEach
在Kotlin是否应该允许这样做?这是编译器错误吗?
答案 0 :(得分:4)
请注意,如果您只想从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