Lua: “require”模块中的变量属于哪个作用域?

学习了 Lua 一周后,我有些震惊地遇到了这种奇怪的情况,因为我之前想象"require"命令的工作方式就像 C/C++ 中的 #include(即预处理器会直接将文件复制粘贴)。

显然情况并非如此。

以下是让我困惑的内容:

-- a.lua
this_is_global = "I'm a global var!!"
require "b"
print(global_in_b) -- error??!! globals in b aren't truly global?

-- b.lua
print(this_is_global) -- prints "I'm a global var!"
-- so b can see globals from a
global_in_b = "Am I global too?"

出于生产率的考虑,我一直在创建自己的表,作为 b 中的作用域,将想要访问的内容添加到该表中,然后在 b 中返回该表,以便我可以写:

-- a.lua
stuff_from_b = require "b"
print(stuff_from_b.global_in_b)  -- does what we want, in a weird way

我知道我也可以在 b.lua 中手动添加内容到 _G 表中,以将它们强制设置为全局变量,但那看起来很丑陋。

我的问题是:

  • "require" 文件中的“全局变量”到底发生了什么? 如果不是在 _G 中什么表里?
  • 访问所需文件的范围的常见方法是什么?
点赞
用户107090
用户107090

requiredofile 都不等同于 include:它们在运行时执行代码,而不是在编译期间文本地添加源代码。

require 引用的文件所看到的全局变量与引用它的文件中看到的全局变量相同。

为了避免污染并允许隐私和隐藏,Lua 模块应创建并返回包含要导出到外部世界的内容的表格。由模块的设计者决定外部世界可以看到什么。

2016-01-11 10:12:50