如何在Lua中声明变量而不将其初始化为nil?

我发现这种做法非常有用:

if not variable then
    variable = value
end

当然,我通常更希望变量是局部的,但我不能在if中声明它为局部变量,否则它将无法访问。

因此,有时我会这样做:

local variable
if not variable then
    variable = value
end

问题在于,当我遍历这段代码时,变量声明将该变量设置为nil。如果我可以使用全局值(我能),我可以通过只在if块外部不声明该变量来解决该问题。

但是,难道我没有同时拥有局部值和使其保持其值的某种方法吗?

点赞
用户1633117
用户1633117

首先,Lua 中定义的 or 的用法为你提供了一个避免使用 if 的很好的习惯用法:

variable = variable or value

如果 variablenilor 将求值为其第二个操作数。当然,这仅在 false 不是 variable 的有效值时才有效(因为就 or 而言,falsenil 都是“假的”)。

但是,你仍然有一个问题,那就是你需要在某个地方声明变量。我想你的问题是,在全局循环中,你认为你必须要执行以下其中一种:

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 重新初始化为 nil

然而,你可以创建另一个块,限制 local 变量的作用域,但不做其他事情:

do
    local variable
    while condition do
        variable = variable or value
        process(variable)
    end
end
2013-03-25 09:16:54
用户6671810
用户6671810

有一种简单的方法可以测试循环内部局部变量的范围:

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在下一次迭代中仍然存在,在第一次打印后,它应该仅打印“THIS IS INTERNAL a”,因为内部局部变量a会遮盖外部的a。这两个字符串交替出现意味着内部局部变量a从未留存在循环的底部。

当然,即使它存活了下来,你也会遇到内部局部变量声明遮盖了上一个迭代的局部变量a的问题。实质上,你将无法访问以前迭代的版本a,到了第三次迭代时,你将有三个独立的内部局部变量,只有最后一个是可访问的。这将与如下操作相同:

local a = "THIS IS INTERNAL a"
local a = "THIS IS INTERNAL a"
local a = "THIS IS INTERNAL a"
2016-08-03 10:44:34