使用彼此本地对象的模块

Modules using each other's local objects

在 vanilla Lua 5.2 中,我有一个模块包含:

最后看起来像这样:

--don't pay attention to what the functions do:
--I am only writing them down to explain how they interact with each other

local A, B, C

C = {
    ...
    {
        function(a)
            B(a)
         end
    }
    ...
}

A = function(a)
    ...
    if (...) then
        B(a)
    end
    ...
    if (...) then
        C[...]...[...](a)
    end
    ...
end

B = function(a)
    A(a)
end

return function(s) -- we called this one D
    A(s)
end

现在,我的问题是:C 的声明使用它自己的局部变量、metatables 和所有这些东西,以至于我将它的声明包含在 do ... end 块中。

它也是 - table 中的所有 table 和每个花括号和缩进的换行符等等 - 相当长。于是想放到自己的模块里,结果访问不到B.

所以,我的问题是:有没有办法将 B 甚至 A 传递给加载时声明 C 的文件?我的意思是这样的,如果可能的话:

--in the original module
local A, B, C

C = require("c", A, B)

...

然后,在 c.lua:

local A, B = select(1, ...), select(2, ...)

C = {
    ...
    {
        function(a)
            B(a)
        end
    }
    ...
}

我真的不知道该怎么做。

有没有一种方法可以将变量从需要的文件传递到需要的文件,而不涉及将变量插入到全局命名空间中?

Is there a way to pass variables from the requiring file to the required file which doesn't involve the variables being inserted in the global namespace?

默认的 require 函数没有,但这不应该阻止您编写自己的 require 函数来执行此操作。显然,这将使解决方案特定于您的应用程序,因此当使用标准 Lua 解释器(具有其 require 功能)时,那些必需的文件将无法正常运行。

主模块:

local A, B, C

A = function(a)
    ...
    if (...) then
        B(a)
    end
    ...
    if (...) then
        C[...]...[...](a)
    end
    ...
end

B = function(a)
    A(a)
end

C = require("c")(A, B)

return function(s) -- we called this one D
    A(s)
end

c.lua:

local function C_constructor(A, B)
    local C = 
        {
            ...
            {
                function(a)
                    B(a)
                end
            }
            ...
        }
    return C
end

return C_constructor