Lua:“必需”模块中的变量的范围是什么?

时间:2016-01-11 04:59:04

标签: scope lua

在学习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表中以强制它们是全局的,但这感觉很难看。

所以我的问题:

  • 在所需文件中使用“全局变量”究竟发生了什么?如果不是_G,他们最终会找到什么表?
  • 访问所需文件范围的常用方法是什么?

1 个答案:

答案 0 :(得分:7)

requiredofile都不等同于include:两者都在运行时运行代码,而不是在编译期间以文本方式添加源代码。

所需文件看到的全局变量与文件中需要它的全局变量相同。

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