Lua 变量范围



我知道还有其他类似的主题,但无法为我的问题找到直接的答案。

假设您有一个函数,例如:

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代码,尽管它可能不是你想要的。

相关内容

  • 没有找到相关文章

最新更新