我有一个文件
module.lua
,其中有一个(或2个?)变量。
-- module.lua
test = 30
local test = 20
test = 40
print("module.lua: " .. test)
我还有我的主文件:
-- main.lua
require("module")
print("main.lua: " .. test)
lua main.lua
的结果:
module.lua: 40
main.lua: 30
我正在使用 lua 变量作用域,但我不再明白这里发生了什么。
当我有一个全局变量和一个同名的局部变量时会发生什么? (然后将该文件导入另一个文件)
我猜在
local
关键字之后,对 test
变量的更改不再是全局的,但在它之前发生的一切都是全局的。 这个有什么用?为什么解释器不抛出错误并防止这种令人困惑的情况?(我是 lua 新手,来自 python 世界)
-- 尝试这个清楚地表明,在
local
之前测试所做的更改是全局的:
-- module.lua
test = 30
test = 70
local test = 20
test = 40
print("module.lua: " .. test)
lua main.lua
->
module.lua: 40
main.lua: 70
最近版本的 Lua 中的全局变量实际上存储在一个名为
_ENV
的表中。 (在所有情况下都是一个上值)
注意:只有在完整声明
local <var>...
之后,引用才被视为本地引用。这意味着像 local test = test
这样的语句会被编译为 local test = _ENV.test
。
考虑到这一点,文件最终实际上会像下面这样编译。
-- module.lua
_ENV.test = 30
local test = 20
-- after this point, any references to `test` mean the local variable
test = 40
print("module.lua: " .. test)
-- main.lua
require("module")
print("main.lua: " .. _ENV.test)