【问题标题】:Lua for loop reduce i? Weird behavior [duplicate]Lua for循环减少我?奇怪的行为[重复]
【发布时间】:2015-06-28 21:53:28
【问题描述】:

谁能解释一下?

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 个表格元素。所以下一个要处理的元素将是 i 再次。在 C 语言中,我会在循环内容的末尾写上 --i 。 lua中的任何官方方式? :)

【问题讨论】:

  • 不要使用循环控制变量。使用其他条件(即使是手动中断条件始终为真的条件)。
  • 您还可以跟踪差异:local d=0; for/do i=i-d; if/then d=d+1 end ... end

标签: for-loop lua decrement


【解决方案1】:

循环索引(在您的情况下为i)是循环体的局部变量,因此您对其进行的任何修改都不会影响循环条件或正在处理的下一个元素(对于@987654323 @循环)。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      你需要另一种循环。

      【讨论】:

        猜你喜欢
        • 2021-01-25
        • 1970-01-01
        • 2019-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多