为什么这个代码不是在Kotlin的标签上返回
为什么这个代码不会从ints2.forEach
返回,而是每次都会输出level 1 xx ====
? 而且,当我将标签let@
设置为ints2.forEach
时没有区别。
fun foo() { val ints = Array(5, {i->i}) ints.forEach let@ { println("level 1 $it ====") val ints2 = Array(3, {i->i}) ints2.forEach { if (it == 2) return@let println("level 2 $it") } } } fun main(args: Array<String>) { foo() }
为什么这个代码不会从ints.forEach返回,并会多次输出“level 1 xx ====”?
通过返回一个标签(在你的情况下是@let
),它只能从forEach
的lambda表达式返回。 因此,你的foo()
相当于下面的代码(使用匿名函数而不是标签)。 这就是为什么forEach
块仍然会被执行的数组中的每个值。 你可以在这里找到更多的细节。
fun foo() { val ints = Array(5, {i->i}) ints.forEach(fun(it: Int) { println("level 1 $it ====") val ints2 = Array(3, {i->i}) ints2.forEach { if (it == 2) return println("level 2 $it") } }) }
当我将标签“let @”设置为ints2.forEach时没有区别。
与上述相同的原因。 通过将@let
标签设置为ints2.forEach
,这个内部forEach
块在it == 2
之前仍然执行两次。