我发现做以下事情非常有用:
if not variable then
variable = value
end
当然,我通常认为该变量是本地的,但我不能在我的if中声明它,或者它不可访问。
所以有时我会这样做:
local variable
if not variable then
variable = value
end
问题是当我迭代这段代码时,变量声明将变量设置为nil。如果我可以接受全局值(我可以),我可以通过不在if块之外声明变量来绕过它。
但是,有没有什么方法可以让我既有本地价值又让它保持价值呢?
答案 0 :(得分:6)
首先,在Lua中定义or
的方式为您提供了一个很好的习惯用法来完全避免if
:
variable = variable or value
如果变量为nil
,则or
将计算为其第二个操作数。当然,只有当false
不是variable
的有效值时才会有效(因为false
和nil
都是“假”,直到{{1}关注)。
但是,您仍然遇到需要在某处声明变量的问题。我想你的问题是,在全局循环的情况下,你认为你必须这样做:
or
(这会使while condition do
variable = variable or value
process(variable)
end
全局)或
variable
这是没有意义的,因为while condition do
local variable
variable = variable or value
process(variable)
end
将范围限制为一次迭代并将local
重新初始化为“无”。
可以做的是创建另一个限制variable
变量范围的块,但不执行任何操作:
local
答案 1 :(得分:0)
有一种简单的方法来测试循环内的本地化范围:
local a = "this is external a"
for x = 1, 3 do
print(a)
local a = "THIS IS INTERNAL a"
print(a)
end
如果您运行此操作,您将获得:
this is external a
THIS IS INTERNAL a
this is external a
THIS IS INTERNAL a
this is external a
THIS IS INTERNAL a
如果循环中的局部 a 存活到下一次迭代,那么在第一次打印之后它应该只打印"这是内部a"因为内部 a 会影响外部 a 。两个字符串交替表示内部局部 a 永远不会存在于循环的底部。
当然,即使它确实存在,你也会遇到内部本地声明的问题,每次循环都会影响前一次迭代的本地 a 。基本上,您将无法访问上一次迭代的 a 版本,而在第三次迭代中,您将拥有3个独立的内部本地,只有最后一个可以访问。这就像你做到这一点一样:
local a = "THIS IS INTERNAL a"
local a = "THIS IS INTERNAL a"
local a = "THIS IS INTERNAL a"