我有一个包含许多不同类的表。我想直接从连接这个表的模块中使用这些类,而不是参考父母(Window而不是app.gui.Window)。
这是我需要的最简单的示例:
t = {
a = 1,
b = 2,
c = 3
}
function f(t)
print(t.b) -- так работает
print(b) -- как заставить работать так?
end
f(t)
UPD:当然,最简单的方法是以这种方式解决问题:b = t.b,但是让我们同意我事先不知道表 t 中的键的名称(更准确地说,它们是我知道的,当然,但这a = t.a; b = t.b; c = t.c ... z = t.z是某种狗屎代码)。
这是我刚刚提出的解决方案:
function f(t)
print(t.b) -- так работает
for k, v in pairs(t) do _G[k] = v end
print(b) -- и так работает!
end
...但是,正如您所看到的,它会影响全局范围,而不是本地范围,这是不允许的!我需要_G的本地类似物,某种_L。
有一个想法是创建这样一个变量并将其注册到元方法debug.getlocal和debug.setlocal中,虽然我并没有真正理解这些函数的语法并且我对元方法的能力也不强,但我会尝试。
我将尝试通过模块来实现范围,将代码放在文件中
test.lua:例如,我们调用模块并检查全局变量
b:2 使用元表和继承的方法:
如果你用help调用这个文件,
require结果是一样的,缺点是继承_G的额外开销。而3方式,你可以只使用setenv设置范围,但是你需要通过类型构造显式调用函数
_G.pairs,这不是很漂亮: