使用彼此本地对象的模块
Modules using each other's local objects
在 vanilla Lua 5.2 中,我有一个模块包含:
两个局部函数,A和B:B会一直调用A,A有时会调用B,有时会调用C中存储的函数;
C:一个table(本地)。它包含 tables,其中包含 tables,其中可以包含 tables... 最后将包含函数。这些函数可能调用A或B;
然后是 return 函数 D,当使用 require
加载我的模块时,它将被 returned。它会调用 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
块中。
它也是 - 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
在 vanilla Lua 5.2 中,我有一个模块包含:
两个局部函数,A和B:B会一直调用A,A有时会调用B,有时会调用C中存储的函数;
C:一个table(本地)。它包含 tables,其中包含 tables,其中可以包含 tables... 最后将包含函数。这些函数可能调用A或B;
然后是 return 函数 D,当使用
require
加载我的模块时,它将被 returned。它会调用 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
块中。
它也是 - 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