【问题标题】:Can't modify loop-variable in lua [duplicate]无法修改lua中的循环变量[重复]
【发布时间】:2016-03-22 21:48:36
【问题描述】:

我在 lua 中尝试这个:

for i = 1, 10,1 do
    print(i)
    i = i+2
end

我希望得到以下输出:

1,4,7,10

但是,i 似乎没有受到影响,所以它给了我:

1,2,3,4,5,6,7,8,9,10

谁能告诉我一些背景概念以及修改计数器变量的正确方法是什么?

【问题讨论】:

  • 如您所见,对循环变量的更改在每次迭代时都会被覆盖。您需要使用 while 循环,并设置计数器并自行递增。
  • 此外,您可以制作自己的生成器并使用通用的 for 循环,我会举个例子,但我不确定该方法有多可取。
  • 这在lua 中并非严格重复。引用的问题只需要通过一个 for 循环递减,这可以通过标准语法for i=start,stop,step 实现。这个问题与在循环中修改迭代器有关。

标签: lua


【解决方案1】:

正如三十二上校所说,在 Lua 中没有办法修改循环变量。或者更确切地说,Lua 中的循环计数器对您隐藏。在您的情况下,变量imerely a copy of the counter's current value。所以改变它什么都不做;每次循环循环时,它都会被实际的隐藏计数器覆盖。

当您在 Lua 中编写 for 循环时,它总是 就是它所说的。这很好,因为当您在固定序列(无论是计数还是一组数据)上进行循环时以及在执行更复杂的事情时,它会非常清晰。

for 用于固定循环;如果你想要动态循环,你必须使用while 循环。这样,代码的读者就知道循环不是固定的。它在你的控制之下。

【讨论】:

【解决方案2】:

当使用数字 for 循环时,您可以将增量更改为第三个值,在您的示例中,您将其设置为 1。

看看我的意思:

for i = 1,10,3 do
    print(i)
end

但是,这并不总是一个实用的解决方案,因为通常您只想在特定条件下修改循环变量。当您希望这样做时,您可以使用 while 循环(或者如果您希望代码至少运行一次,请使用重复循环):

local i = 1
while i < 10 do
    print(i)
    i = i + 1
end

使用 while 循环,您可以完全控制条件和任何变量(无论是全局变量还是上值变量)。

【讨论】:

  • 此外,您可以制作自己的生成器并使用通用的 for 循环,我会举一个例子,但我不确定该方法有多可取。
【解决方案3】:

到目前为止,所有答案/ cmets 仅建议使用 while 循环;这里还有两种解决此问题的方法:


如果你总是有相同的步长,只是不是1,你可以明确地给出步长,如for i =start,@ 987654325@,stepdo … end,例如for i = 1, 10, 3 do …for i = 10, 1, -1 do …。如果你需要不同的步长,那是行不通的。


while-loops 的一个“问题”是您总是必须手动增加计数器,而在子分支中忘记这一点很容易导致无限循环。我见过几次以下模式:

local diff = 0
for i = 1, n do
   i = i+diff
   if i > n then  break  end
   -- code here
   -- and to change i for the next round, do something like
   if some_condition then
       diff = diff + 1  -- skip 1 forward
   end
end

这样,您就不会忘记递增i,并且您的代码中仍然可以使用调整后的i。增量也保存在一个单独的变量中,因此扫描它以查找错误相对容易。 (i 自动增量必须有效,循环主体第一行下方对i 的任何分配都是错误,请检查您是否分配了diff,检查分支,...)

【讨论】:

  • "我已经多次看到以下模式:" 这到底比while 循环好多少?哦,当然,你使无限循环变得不可能,但是你使阅读代码正在做什么变得更加困难。你有一个提前休息,一个不同的额外循环变量等等。while 循环会更容易理解。
  • @NicolBolas 我并不是说它更好,只是它存在并且在某些情况下可能更可取。 (例如,如果您仍然需要 diff/delta,while 版本会更笨拙。)如果您更关心一眼看到某些代码不能做某事而不是快速理解所有代码确实,这个版本也可能更可取。 (检查标题下方的任何地方都没有分配给循环计数器识别所有路径/出口检查每个路径的增量。)什么是“更具可读性”取决于你在做什么以及你习惯了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
相关资源
最近更新 更多