模块使用彼此的本地对象

时间:2016-08-01 14:57:51

标签: module lua local

在vanilla Lua 5.2中,我有一个包含以下内容的模块:

  • 两个本地函数A和B:B将始终调用A,A有时会调用B,有时会调用存储在C中的函数;

  • C:表格(本地)。它包含的表包含可以包含表的表...最后它们将包含函数。这些函数可以调用A或B;

  • 然后是返回函数D,当我使用require加载模块时将返回该函数。它将调用A.

最后,它看起来很像:

--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块中包含它的声明。

它也是 - 所有那些表内的表和每个花括号和缩进的换行符等等 - 很长。所以我想把它放在自己的模块中,但它无法访问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
    }
    ...
}

我真的不知道该怎么做。

有没有办法将变量从需求文件传递到所需的文件,而这些文件并不涉及在全局命名空间中插入的变量?

2 个答案:

答案 0 :(得分:2)

主要模块:

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

答案 1 :(得分:0)

  

有没有办法将变量从需求文件传递到所需的文件,而这些文件并不涉及在全局命名空间中插入的变量?

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