首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Bareword添加到Lua

将Bareword添加到Lua
EN

Stack Overflow用户
提问于 2013-09-06 16:06:09
回答 1查看 149关注 0票数 4

以便可以将print("foo")编写为print(foo)

我这样做的方式是通过更改环境表_G的元表。

代码语言:javascript
复制
mt = {__index = function(tbl,key) return key end}
setmetatable(_G, mt)

这是可行的,因为检索变量foo的值是由_G.foo完成的,它等同于_G["foo"]

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

EN

回答 1

Stack Overflow用户

发布于 2013-09-06 16:21:45

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

代码语言:javascript
复制
print(foo)   -- does what you think
local foo = 2
print(foo)   -- argh!

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

编辑:(回复评论)。

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18652859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档