Lua for loop reduce i?奇怪的行为

Lua for loop reduce i? Weird behavior

谁能给我解释一下?

for i = 1, 5 do
  print(i)
  i = i - 1
  print(i)
end

输出为:

1
0
2
1
3
2
and so forth

我预计i会在1和0之间变化。但显然它一直在增加,就好像我根本没有改变它一样。怎么回事?

我不得不时不时地删除第 i 个 table 元素。因此,下一个要处理的元素将再次是 i。在 C 中,我会在循环内容的末尾写 --i 。 lua有什么正式的方式吗? :)

使用 while(true) 循环怎么样?然后你必须手动中断,但这可能有效。

local i = 5
while(true) do
    print(i)
    i = i - 1
    if (i == 0) then break; end
end

循环索引(i 在你的例子中)是循环体的局部变量,所以你对它做的任何修改都不会影响循环条件或正在处理的下一个元素(对于 for 循环)。

如果你需要更好地控制索引删除元素并继续处理,你应该使用while循环形式。有关详细信息,请参阅 For Statement 部分。

尝试设置循环控制变量会导致故障安全行为。

我在手册的最新版本的“语言不兼容”部分找不到它,但我记得它在某处被列为更改。它更像是以前未定义行为的形式化。

如果您真的很好奇,请查看 luac 中的程序列表。循环控制变量有一个内部名称,因此无法更改。如果在赋值中使用相同的名称,则局部变量被合成为替代变量。它可以防止无意中导致 for 变为无限大。

你需要另一种循环。