我知道还有其他类似的主题,但无法为我的问题找到直接的答案。
假设您有一个函数,例如:
function aFunction()
local aLuaTable = {}
if (something) then
aLuaTable = {}
end
end
对于 if 语句中的 aLuaTable 变量,它仍然是局部的 right?。基本上我要问的是,如果我第一次将一个变量定义为局部变量,然后我一次又一次地使用它,它会在程序的余生中保持局部吗,这究竟是如何工作的?
此外,我阅读了Lua全局变量的定义:
任何不在已定义块中的变量都被称为在全局范围内。 全局范围内的任何内容都可以由所有内部作用域访问。
不在定义的块中是什么意思?,我的理解是,如果我在任何地方"声明"一个变量,它将始终是全局的,这是不正确的吗?
抱歉,如果问题太简单,但是来自Java和objective-c,lua对我来说很奇怪。
"任何不在定义块中的变量都被称为在全局范围内。
这是完全错误的,所以你的困惑是可以理解的。看起来你从用户维基上得到了它。我刚刚用更正信息更新了页面:
任何未定义为local
变量都是全局变量。
我的理解是,如果我在任何地方"声明"一个变量,它将永远是全局的
如果您不将其定义为 local
,它将是全局的。但是,如果您随后创建一个具有相同名称的local
,它将优先于全局(即Lua在尝试解析变量名称时首先"看到"局部变量(。请参阅本文底部的示例。
编译如果我第一次将一个变量定义为局部变量,然后我一次又一次地使用它,它会在程序的余生中保持局部,这究竟是如何工作的?
代码时,Lua 会跟踪您定义的任何局部变量,并知道哪些变量在给定范围内可用。每当您读取/写入变量时,如果范围内存在具有该名称的局部变量,则会使用它。如果没有,读/写将(在编译时(转换为表读/写(通过表_ENV(。
local x = 10 -- stored in a VM register (a C array)
y = 20 -- translated to _ENV["y"] = 20
x = 20 -- writes to the VM register associated with x
y = 30 -- translated to _ENV["y"] = 30
print(x) -- reads from the VM register
print(y) -- translated to print(_ENV["y"])
局部变量按词法范围划分。其他一切都在_ENV
x = 999
do -- create a new scope
local x = 2
print(x) -- uses the local x, so we print 2
x = 3 -- writing to the same local
print(_ENV.x) -- explicitly reference the global x our local x is hiding
end
print(x) -- 999
对于 if 语句中的 aLuaTable 变量,它仍然是局部的,对吗?
我不明白你在这里是如何感到困惑的;规则与Java完全相同。该变量仍在范围内,因此它继续存在。
local
变量等效于在 Java 中定义"堆栈"变量。变量存在于定义它的块范围内,并在该块结束时不复存在。
考虑以下 Java 代码:
public static void main()
{
if(...)
{
int aVar = 5; //aVar exists.
if(...)
{
aVar = 10; //aVar continues to exist.
}
}
aVar = 20; //compile error: aVar stopped existing at the }
}
"全局"只是任何非本地变量名称。考虑与上述等效的Lua代码:
function MyFuncName()
if(...) then
local aVar = 5 --aVar exists and is a local variable.
if(...) then
aVar = 10 --Since the most recent declaration of the symbol `aVar` in scope
--is a `local`, this use of `aVar` refers to the `local` defined above.
end
end
aVar = 20 --The previous `local aVar` is *not in scope*. That scope ended with
--the above `end`. Therefore, this `aVar` refers to the *global* aVar.
end
在Java中是一个编译错误,这是完全有效的Lua代码,尽管它可能不是你想要的。