现在,我一直在制作像这样的for循环
local i
for i = 1, 10 do
--stuff
end
因为我认为您应该尝试保留local
以获得更好的性能并降低错误风险。
但是,我注意到使用它是很常见的。
for i = 1, 10 do
--stuff
end
使用local
是首选,还是省略它是无害的?
答案 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;