命名空间和模块 |
|
Lua 没有命名空间。有时将代码组织成带有命名空间的包和模块以避免名称冲突并组织代码会很有用。以下是一些在 Lua 中提供支持的建议。
有一篇 Lua 技术说明讨论了模块和包 [1]。
dofile
命令是否可以扩展到 dofile(filename, table)
,并将传递的表用作执行文件的全局表?例如,
String = {} dofile("stringlib.lua",String) x = String.strlen("a string")
function dofile(f,t) local globals=globals local g=globals(t) local rc=%dofile(f) globals(g) return rc end
(lhf) 如果你愿意使用 "全局" 声明,那么现在就可以做一些非常相似的事情:使用 "全局" 函数代替 "全局" 关键字,语法如下
global "myvar" -- 仅一个名称
global{"a","b"} -- 多个名称
do local G={} function global(x) if type(x)=="string" then %G[x]=1 else for i,v in x do %G[v]=1 end end end end
现在可以通过为 "setglobal" 和/或 "getglobal" 设置标签方法来实现你想要的语义,该方法会检查名称是否与 G 相匹配。
因此,要实现需要声明才能写入全局变量的语义,请设置 "setglobal" 标签方法,如果给定的变量不在 G 中,则引发错误。错误将在发生时立即显示;即没有休眠者!
有关详细信息,请参阅有关未初始化和只读变量的常见问题解答。
这种方法的问题是声明永远有效,而不仅仅是当前块有效。
(ET) 或者简单的方法
global = globals()
...
global.x = 1
print(global.y)