如何在Lua中声明变量而不将其赋予nil?

时间:2013-03-25 08:00:41

标签: variables lua scope local declaration

我发现做以下事情非常有用:

if not variable then
    variable = value
end

当然,我通常认为该变量是本地的,但我不能在我的if中声明它,或者它不可访问。

所以有时我会这样做:

local variable
if not variable then
    variable = value
end

问题是当我迭代这段代码时,变量声明将变量设置为nil。如果我可以接受全局值(我可以),我可以通过不在if块之外声明变量来绕过它。

但是,有没有什么方法可以让我既有本地价值又让它保持价值呢?

2 个答案:

答案 0 :(得分:6)

首先,在Lua中定义or的方式为您提供了一个很好的习惯用法来完全避免if

variable = variable or value

如果变量为nil,则or将计算为其第二个操作数。当然,只有当false不是variable的有效值时才会有效(因为falsenil都是“假”,直到{{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"