在学习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表中以强制它们是全局的,但这感觉很难看。
所以我的问题:
答案 0 :(得分:7)
require
和dofile
都不等同于include
:两者都在运行时运行代码,而不是在编译期间以文本方式添加源代码。
所需文件看到的全局变量与文件中需要它的全局变量相同。
为了避免污染并允许隐私和隐藏,最好是Lua模块创建并返回一个表格,其中包含他们想要导出到外部世界的内容。由模块的设计者决定从外部可以看到什么。