在Lua中的嵌套命名空间

我正在嵌入解释器中尝试使用Lua(所以我对环境没有很多掌控力)。现有的Lua脚本基础设施是我们从外部供应商那里获得的,因此:

  1. 除非紧急情况,否则我不想改变它;
  2. 我想保持我的代码与供应商的代码分开。

他们的策略是将许多模块加载到全局命名空间中——他们有很多模块文件,可以有效地完成以下操作

modulename = modulename or {}
modulename.something = function()
    ...
end

这在某种程度上是好的,因为它展示了我必须使用的API,而且一切都很容易获得。然而,我确定会遇到名称冲突;如果我自己创建了一个名为X的模块而他们已经有了一个名为X的模块,我最终会将其添加到其中(而且代码位于不同的位置,所以我可能会出于无意识而这样做)。

我想做的是使用单个根命名空间,所有我的模块都是其中的一部分,这样我就可以干净地隔离并且不必担心意外覆盖核心api。

到目前为止,我的代码如下:

root = root or {}
root.modulename = require('path to module')
   -- etc...
return root

作为我的根命名空间,然后

local modulename = {}
function modulename.something()
      return "foo"
end
return modulename

这样似乎给了我想要的隔离:我可以在解释器中这样做

root.modulename.something()

并得到我的“foo”。

然而,我想知道这可能会产生什么困难,如果有更常见的解决方案。如果root.othermodule想要使用root.modulename的一个成员,可能会发生什么——我是否必须手动管理加载顺序?

点赞