在 Kotlin 中跳出 for 循环

3

我有一个简单的循环和条件,但是你可以看到下面的代码我无法跳出循环:

rwloop@ for (z in rendered_words.size-1 downTo 0 )
                {
                    var css_=rendered_words[z].node.attr("class")
                    css_?.let {
                        if (css_=="classzero") {
                            break@rwloop
                        }
                    }
                }

但是我在break@rwloop中收到了以下错误提示:

break或continue跨越了函数或类的边界


1
你应该能够摆脱let。==表达式可以翻译为a?.equals(b) ?: (b === null)。 - Michael
请参考为什么不能在let或run中使用continue以获取解决方法,并查看KT-1436中的良好预测。 - Vadzim
2个回答

5
放弃使用 let lambda,因为@rwloop标签在其中不可见,使用以下内容:
        rwloop@ for (z in rendered_words.size-1 downTo 0 )
        {
            var css_=rendered_words[z].node.attr("class")
            if (css_ != null) {
                if (css_=="classzero") {
                    break@rwloop
                }
            }
        }

1
现在不需要标签。break会自动匹配最内层的循环结构。 - Marko Topolnik
@MarkoTopolnik 是的,但是代码已经包含了标签,所以我没有修改它。而且我在 Kotlin 中总是使用标签,以防万一... - user8959091

1

https://kotlinlang.org/docs/reference/inline-functions.html#non-local-returns

它说明

break和continue在内联lambda中尚不可用,但我们计划也支持它们。

所以,你应该

  1. 等待其支持到来
  2. 或者使用局部返回语句代替,

如何?

Lambda本身就是一个函数,所以你可以从它返回,这将产生与continue相同的效果(如果它是for循环中的最后一件事情)。

rwloop@ for(z in rendered_words.size-1 downTo 0 ) {
    var css_=rendered_words[z].node.attr("class")
    css_?.let {
        if (css_=="classzero") {
            return@let
        }
    }
}

Kotlin将lambda视为边界(它不是内部类,因为它是内联的),因此到目前为止您无法通过breakcontinue跨越它。

3
那个 return@let 会真的跳出循环吗?他需要像这样的东西 run blabla@ { ... css?.let { ... return@blabla } } 吗?(或者,既然这段代码中的 let 看起来是没有意义的,他可以将其删掉并正常使用 break)。 - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接