Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 如何在Lua中声明变量而不将其初始化为nil?_Variables_Lua_Scope_Local_Declaration - Fatal编程技术网

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"