以便可以将print("foo")编写为print(foo)
我这样做的方式是通过更改环境表_G的元表。
mt = {__index = function(tbl,key) return key end}
setmetatable(_G, mt)这是可行的,因为检索变量foo的值是由_G.foo完成的,它等同于_G["foo"]
这是一种好的方法吗?有没有隐藏的缺点?有没有更好的方法?我是否可以这样做,使赤裸裸的话只在某个文件中起作用?(也许通过使用loadstring从另一个luascript执行该文件)
发布于 2013-09-06 16:21:45
一旦有人声明了一个与您的“关键字”同名的本地变量,它将隐藏您的“关键字/全局变量”,并且您的机制将失败:
print(foo) -- does what you think
local foo = 2
print(foo) -- argh!请注意,您不能阻止在脚本中定义局部变量。
编辑:(回复评论)。
您使用的是定制的Lua引擎吗?您无法阻止进入本地作用域,因为您始终处于本地作用域中。事实恰恰相反:从技术上讲,Lua中没有全局作用域(例如,在C中具有相同的含义)。取而代之的是全局名称空间(以表的形式实现)。访问全局变量的机制在Lua5.1(函数环境)和Lua5.2(隐式_ENV前缀)之间有所不同,但概念几乎相同。
特别是,当Lua脚本被加载时,无论是由解释器加载的,还是由load、loadstring、dofile等加载的,它都会被解释为匿名函数(闭包)的主体,通常被称为“主块”。因此,总是有一个局部作用域。在标准的Lua中,当解析器在加载的脚本中遇到local语句时,您无法阻止局部变量的定义。
https://stackoverflow.com/questions/18652859
复制相似问题