循环计数器应该是本地的

时间:2016-03-29 17:15:47

标签: lua

现在,我一直在制作像这样的for循环

local i
for i = 1, 10 do
  --stuff
end

因为我认为您应该尝试保留local以获得更好的性能并降低错误风险。

但是,我注意到使用它是很常见的。

for i = 1, 10 do
  --stuff
end

使用local是首选,还是省略它是无害的?

3 个答案:

答案 0 :(得分:2)

(编辑)您提供的代码示例之间没有区别。但是,请注意,使用local i定义的变量与for i = 1, 10 do循环中使用的变量不同。当循环退出时,i的原始值保持不变(即i == nil)。

siffiejoe指出,即使事先定义了相同的变量名,循环控制/计数器变量仍然可以在循环外部永久访问。对循环中的变量的任何引用都将使用循环值。循环的外部的任何引用都将使用原始或非循环值。

因此,在for语句中重用现有变量名称而不破坏原始名称是安全的。如果你想在循环之后访问计数器变量,你可以事先定义一个额外的变量,并在循环内更新它,如下所示(siffiejoe的例子):

local j
for i = 1, 10 do
    j = i
    --[[ stuff ]]
end
print(j) -- j stores the last value of i before the loop exits

文档:Numeric for

答案 1 :(得分:2)

简短回答:不要在local i循环之前添加for,因为它无用且令人困惑。

for循环启动一个新块,控制变量(此处为i)已经是该块的本地。添加local i类似于:

local i
do
    local i = 0
    -- do something
end

请注意,块内的i是一个全新的变量,它会遮挡外部的i。当块结束时,块外的i会恢复生命,但不知道块内发生了什么,因为除了具有相同的名称外,这两个变量之间没有任何关系。

答案 2 :(得分:1)

Lua中的for循环控制结构有一些特殊性,它并不完全等同于C for循环。

其中一个特点是它的索引变量由循环控制。索引var本身就是本地的,并且在循环内修改它实际上没有效果。例如:

for i=1,5 do
   io.write(("i: %d; "):format(i))
   i = i + 10 -- this has no effect, as 'for' is in control of the index var.
end

结果:

i: 1; i: 2; i: 3; i: 4; i: 5;