为什么这个代码不是在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之前仍然执行两次。