4

为了在 lua 中实现特定领域的语言,我想在语言中添加裸词。所以 print("foo")可以写成print(foo)

我这样做的方法是更改​​环境表的元表_G

mt = {__index = function(tbl,key) return key end}
setmetatable(_G, mt)

这很有效,因为检索变量的值foo是通过_G.foo相当于_G["foo"]

这是一个好方法吗?有没有隐藏的缺点?有没有更好的办法?我可以这样做以使裸词仅在某个文件中起作用吗?(也许通过从另一个 luascript 执行该文件,使用loadstring

4

1 回答 1

4

一旦有人声明一个与您的“关键字”同名的本地人,它就会隐藏您的“关键字/全局变量”并且您的机制将失败:

print(foo)   -- does what you think
local foo = 2
print(foo)   -- argh!

请注意,您不能阻止在脚本中定义局部变量。

编辑:(回答评论)。

你在使用定制的 Lua 引擎吗?您无法阻止进入本地范围,因为您始终处于本地范围内。恰恰相反:从技术上讲,Lua 中没有全局作用域(例如,与 C 中的含义相同)。取而代之的是一个全局命名空间(实现为表)。Lua 5.1(函数环境)和 Lua 5.2(隐式前缀)访问全局变量的机制不同_ENV,但概念几乎相同。

特别是,当 Lua 脚本被加载时,无论是通过解释器,还是通过loadloadstringdofile等,它都被解释为匿名函数的主体(闭包),通常称为“主块”。因此,总是有一个局部范围。local在标准 Lua 中,当解析器遇到正在加载的脚本中的语句时,您无法阻止定义局部变量。

于 2013-09-06T08:21:44.680 回答