为什么这个代码没有在Kotlin的标签处返回

时间:2017-06-04 03:26:00

标签: 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()
}

1 个答案:

答案 0 :(得分:2)

  

为什么此代码不会从ints.forEach返回并且会多次输出“level 1 xx ====”?

通过返回标签(在您的情况下为library(stringdist) i1 <- with(df1, stringdist(X, Y, method = "qgram")) df1[i1 %in% tail(sort(i1), 2),] # X Y #1 SAN DIEGO FOND DU LAC #10 FLORIDA NEW JERSY ),它仅从# Blender v2.77 (sub 0) OBJ File: 'icosahedron.blend' # www.blender.org mtllib icosahedron.mtl o Icosphere v 0.000000 -1.000000 0.000000 v 0.723600 -0.447215 0.525720 v -0.276385 -0.447215 0.850640 v -0.894425 -0.447215 0.000000 v -0.276385 -0.447215 -0.850640 v 0.723600 -0.447215 -0.525720 v 0.276385 0.447215 0.850640 v -0.723600 0.447215 0.525720 v -0.723600 0.447215 -0.525720 v 0.276385 0.447215 -0.850640 v 0.894425 0.447215 0.000000 v 0.000000 1.000000 0.000000 vt 0.6739 0.5441 vt 0.5057 0.4329 vt 0.6731 0.1917 vt 0.5162 0.7848 vt 0.8418 0.4311 vt 0.8321 0.7831 vt 0.3418 0.5689 vt 0.3321 0.2169 vt 1.0162 0.2152 vt 1.0057 0.5671 vt 1.1731 0.8083 vt 0.1731 0.8083 vt 0.1739 0.4559 vt 0.0162 0.2152 vt 0.0057 0.5671 vn 0.1876 -0.7947 0.5774 vn 0.6071 -0.7947 0.0000 vn -0.4911 -0.7947 0.3568 vn -0.4911 -0.7947 -0.3568 vn 0.1876 -0.7947 -0.5774 vn 0.9822 -0.1876 0.0000 vn 0.3035 -0.1876 0.9342 vn -0.7946 -0.1876 0.5774 vn -0.7946 -0.1876 -0.5774 vn 0.3035 -0.1876 -0.9342 vn 0.7946 0.1876 0.5774 vn -0.3035 0.1876 0.9342 vn -0.9822 0.1876 0.0000 vn -0.3035 0.1876 -0.9342 vn 0.7946 0.1876 -0.5774 vn 0.4911 0.7947 0.3568 vn -0.1876 0.7947 0.5774 vn -0.6071 0.7947 0.0000 vn -0.1876 0.7947 -0.5774 vn 0.4911 0.7947 -0.3568 usemtl None s off f 1/1/1 2/2/1 3/3/1 f 2/2/2 1/1/2 6/4/2 f 1/1/3 3/3/3 4/5/3 f 1/1/4 4/5/4 5/6/4 f 1/1/5 5/6/5 6/4/5 f 2/2/6 6/4/6 11/7/6 f 3/3/7 2/2/7 7/8/7 f 4/5/8 3/3/8 8/9/8 f 5/6/9 4/5/9 9/10/9 f 6/4/10 5/6/10 10/11/10 f 2/2/11 11/7/11 7/8/11 f 3/3/12 7/8/12 8/9/12 f 4/5/13 8/9/13 9/10/13 f 5/6/14 9/10/14 10/11/14 f 6/4/15 10/12/15 11/7/15 f 7/8/16 11/7/16 12/13/16 f 8/14/17 7/8/17 12/13/17 f 9/15/18 8/14/18 12/13/18 f 10/12/19 9/15/19 12/13/19 f 11/7/20 10/12/20 12/13/20 内的lambda表达式返回。因此,@let等同于以下代码(使用匿名函数而不是标签)。这就是为什么仍然会为数组中的每个值执行forEach块的原因。您可以找到更多详细信息here

foo()
  

当我将标签“let @”设置为时,没有区别   ints2.forEach。

与上述相同的原因。通过将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之前执行两次。