命名空间和模块

lua-users home
wiki

[!] 版本说明: 下面的文章适用于旧版本的 Lua,Lua 4。Lua 5.1 有模块系统、环境等。

Lua 没有命名空间。有时将代码组织成带有命名空间的包和模块以避免名称冲突并组织代码会很有用。以下是一些在 Lua 中提供支持的建议。

有一篇 Lua 技术说明讨论了模块和包 [1]

在命名空间中执行 Lua 文件

问题:dofile 命令是否可以扩展到 dofile(filename, table),并将传递的表用作执行文件的全局表?例如,
String = {}
dofile("stringlib.lua",String)
x = String.strlen("a string")
(lhf) 试试这个
function dofile(f,t)
  local globals=globals
  local g=globals(t)
  local rc=%dofile(f)
  globals(g)
  return rc
end

"全局" 关键字

目前(在 Lua 版本 4.0 及更低版本中)不支持 "全局" 关键字。Lua 4.1 及更高版本可能支持此功能(详细信息请参阅邮件列表存档)。这可以通过以下方式模拟

(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)


另请参阅:示例代码类和方法
最近更改 · 首选项
编辑 · 历史
最后编辑于 2007 年 1 月 5 日 上午 6:43 GMT (差异)