推荐的方法是在Lua 5.2中递归地相互引用2个以上的模块

fin*_*nnw 6 lua module circular-dependency lua-5.2

有办法吗?

  • 两个Lua模块(让我们称他们为AB)
  • 每个模块使用另一个模块的功能,因此它们必须require相互配合
  • 第三个模块(让我们称之为C)可以使用A但不能使用Beg

C.lua:

local A = require 'A'

-- ...

A.foo()
Run Code Online (Sandbox Code Playgroud)
  • 可能有另一个模块D需要B但不需要A和/或E要求两个AB
  • 无论是A也不是B,也没有他们的成员应该被加入到全局命名空间.
  • 避免使用modulesetfenv函数(Lua 5.2中不推荐使用)

相关:Lua - 我如何使用另一个lib?(注意:此解决方案不处理循环依赖.)

fin*_*nnw 6

我找到了一个很简单的方法:

A.lua:

local A = {}
local B

function A.foo()
    B = B or require 'B'
    return B.bar()
end

function A.baz()
    return 42
end

return A
Run Code Online (Sandbox Code Playgroud)

B.lua:

local B = {}
local A

function B.bar()
    A = A or require 'A'
    return A.baz()
end

return B
Run Code Online (Sandbox Code Playgroud)

  • [参考手册](http://www.lua.org/manual/5.1/manual.html#pdf-require)中没有关于它的警告,所以我认为这是安全的. (5认同)
  • 你可以在代码中的任何地方使用`require`.例如,我经常使用这个习惯用法在文件中的给定点启动RemDebug:`if somecondition然后需要'remdebug.engine'.start()end` (2认同)