Variables 如何在Lua中声明变量而不将其初始化为nil?
我发现这样做非常有用:Variables 如何在Lua中声明变量而不将其初始化为nil?,variables,lua,scope,local,declaration,Variables,Lua,Scope,Local,Declaration,我发现这样做非常有用: if not variable then variable = value end 当然,我通常希望该变量是局部变量,但我不能在if中声明它为局部变量,否则它将无法访问 所以有时候我会: local variable if not variable then variable = value end 问题是,当我迭代这段代码时,变量声明将变量设置为nil。如果我可以使用全局值(我可以),我可以通过不在If块之外声明变量来绕过它 但是有没有一种方法可以让
if not variable then
variable = value
end
当然,我通常希望该变量是局部变量,但我不能在if中声明它为局部变量,否则它将无法访问
所以有时候我会:
local variable
if not variable then
variable = value
end
问题是,当我迭代这段代码时,变量声明将变量设置为nil。如果我可以使用全局值(我可以),我可以通过不在If块之外声明变量来绕过它
但是有没有一种方法可以让我既拥有本地值,又让它保持其值呢?首先,Lua中定义
或
的方法提供了一个很好的习惯用法,可以避免if
:
variable = variable or value
如果变量为nil
,或
将计算为其第二个操作数。当然,这只在false
不是变量的有效值时才起作用(因为false
和nil
就或而言都是“false”)
但是,您仍然存在需要在某处声明变量的问题。我想您的问题是,在全局循环的情况下,您认为您必须执行以下任一操作:
while condition do
variable = variable or value
process(variable)
end
(这将使变为全局变量)或
这是毫无意义的,因为local
将范围限制为一次迭代,并将变量重新初始化为`nil'
您可以做的是创建另一个块来限制本地
变量的范围,但不做其他事情:
do
local variable
while condition do
variable = variable or value
process(variable)
end
end
有一种简单的方法可以测试循环中局部变量的范围:
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"
不清楚你想在这里做什么。如果您创建一个新的局部变量,那么根据定义,它的值将为零。那么,您究竟要检查哪个变量的值呢?是否要声明新变量?这是递归函数调用吗?谢谢您的回答。实际上,我想知道,因为我想测试“local limits the scope to one iteration”是否正确。Perl和Ruby都有一个类似的习惯用法,使用“| |或”运算符,因此您可以看到诸如val | |=“default”之类的代码;这个值或默认习惯用法非常有用。@ChuckCottrill是的,在JavaScript中也可以这样做。可能在大多数有“真实”和“虚假”概念的语言中。
local a = "THIS IS INTERNAL a"
local a = "THIS IS INTERNAL a"
local a = "THIS IS INTERNAL a"