如何在 Kotlin 循环内更改 for 循环的计数器变量值?

How to change the counter variable value of for loop inside the loop in Kotlin?

我是 Kotlin 的新手,为了练习,我正在将我的 Java 代码转换成 Kotlin。

在执行此操作时我遇到了一个问题,即我无法更改 for 循环内的计数器值。它实际上说变量是 val.

for (i in 0..tokens.size){
    // some code
    if (memory[pointer]!=0)
        i=stack.peek() // error here showing : val cannot be reassigned
}

我真的希望在循环内更改计数器变量。有没有其他方法可以在 Kotlin 中没有任何错误地实现这一目标?

在 Kotlin 中,val 变量等同于 Java 的 final,这意味着它们一旦赋值就无法更改。当您希望重新分配变量时,请改用 var。如果可能,您应该保留 val 以防止意外重新分配。

示例:

var a = 5

a = 4 // works

val b = 5

b = 4 // compiler error!

编辑

for循环中的变量默认为val,不可更改。为了实现带跳转的循环,需要用while循环代替。

请注意,for...in 循环不是带计数器的循环,而是 foreach 循环 - 即使您使用 range 进行迭代(好吧,至少在概念上是这样,因为在内部它实际上被优化为带有柜台)。您不能跳转到 array/list 中的另一个项目,因为 for 并不真正“理解”迭代背后的逻辑。即使您能够修改 i 的值,然后在下一次迭代中它将重置为下一个项目。

您需要使用 while 来代替:

var i = 0
while (i < tokens.size) {
    if (memory[pointer]!=0)
        i=stack.peek()

    i++
}

另请注意,您的原始代码包含一个差一错误。在上一次迭代中,i 将变为 tokens.size,这可能不是您需要的。

kotlin 循环变量(在您的例子中是 i)是使用 val 隐式声明的,因此您不能重新分配它们。您唯一的选择是使用 while 循环并更新在循环外声明的变量。

来自Kotlin language spec

The for-loop is actually an overloadable syntax form with the following expansion:

for(VarDecl in C) Body is the same as

when(val $iterator = C.iterator()) {
    else -> while ($iterator.hasNext()) {
                val VarDecl = __iterator.next()
                <... all the statements from Body>
            } } ```