Lua导入同名全局变量和局部变量

问题描述 投票:0回答:1

我有一个文件

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 scope
1个回答
0
投票

最近版本的 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)
© www.soinside.com 2019 - 2024. All rights reserved.