lua变量范围

Osc*_*mez 4 variables lua scope global-variables

我知道还有其他类似的主题,但找不到我的问题的直接答案.

假设你有一个如下功能:

function aFunction()
  local aLuaTable = {}
  if (something) then
     aLuaTable = {}
  end
end
Run Code Online (Sandbox Code Playgroud)

对于if语句中的aLuaTable变量,它仍然是本地的吗?基本上我要问的是,如果我第一次将变量定义为本地变量,然后我一次又一次地使用它,它会在程序的其余部分保持在本地,这是如何工作的?

另外我读了Lua全局变量的这个定义:

不在定义的块中的任何变量被称为在全局范围内.所有内部范围都可以访问全局范围内的任何内容.

不是在一个定义的块中是什么意思?我的理解是,如果我在任何地方"声明"一个变量,它将永远是全局的,那是不正确的?

对不起,如果问题太简单,但来自Java和objective-c,对我来说,lua非常奇怪.

Mud*_*Mud 10

"任何不在定义块中的变量都被认为是在全球范围内."

这是完全错误的,所以你的困惑是可以理解的.看起来你从用户维基得到了它.我刚刚用更正信息更新了页面:

任何未定义的变量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"])
Run Code Online (Sandbox Code Playgroud)

当地人有词汇范围.其他一切都进去了_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
Run Code Online (Sandbox Code Playgroud)

  • 只是注意`_ENV`只是Lua 5.2.在Lua 5.1(以及之前)中,全局变量存储在`_G`中(实际上它比这更复杂,你可以改变函数的环境等). (2认同)
  • 我考虑过提到_G(这是5.1中的全局状态和5.2中_ENV的默认值),但我认为这只会令人困惑.5.2是最新版本所以我选择_ENV.除了在5.1中_ENV引用将是_G引用之外,有关范围的所有信息都是相同的. (2认同)