我在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
有人可以告诉我一些背景概念以及修改计数器变量的正确方法吗?
答案 0 :(得分:9)
正如上校三十二说的那样,没有办法在Lua中修改循环变量。或者更重要的是,Lua中的循环计数器是隐藏。您的案例中的变量i
为merely a copy of the counter's current value。所以改变它什么都不做;每次循环循环时,它都会被实际的隐藏计数器覆盖。
当您在Lua中编写for
循环时,总是意味着它所说的内容。这很好,因为当你在一个固定的序列(无论是计数还是一组数据)上进行循环时,以及当你做一些更复杂的事情时,它会非常清楚。
for
用于固定循环;如果要进行动态循环,则必须使用while
循环。这样,代码的读者就知道循环不是固定的;它在你的控制之下。
答案 1 :(得分:4)
使用Numeric 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循环可以完全控制条件和任何变量(无论是全局变量还是上变量)。
答案 2 :(得分:1)
到目前为止,所有答案/评论仅建议循环;以下是另外两种解决此问题的方法:
如果您始终拥有相同的步长,而不是1
,则可以明确指定步长,如for i =
start
,
end
,
step
do … end
,例如for i = 1, 10, 3 do …
或for i = 10, 1, -1 do …
。如果您需要不同的步长,那就不会有效。
A&#34;问题&#34;使用while
- 循环是你总是需要手动递增你的计数器并在子分支中忘记它容易导致无限循环。我已经多次看到以下模式:
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
,检查分支机构,...)