2

我发现执行以下操作非常有用:

if not variable then
    variable = value
end

当然,我通常宁愿那个变量是本地的,但我不能在我的 if 中声明它是本地的,否则它将无法访问。

所以有时我会这样做:

local variable
if not variable then
    variable = value
end

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

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

4

2 回答 2

7

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

variable = variable or value

如果变量是nilor将评估为它的第二个操作数。当然,这只有在false不是有效值的情况下才有效variable(因为false和就相关而言nil都是“假” 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为`nil。

但是,您可以做的是创建另一个块来限制变量的范围,local但什么也不做:

do
    local variable
    while condition do
        variable = variable or value
        process(variable)
    end
end
于 2013-03-25T09:16:54.237 回答
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"
于 2016-08-03T10:44:34.267 回答