我是lua的新手,我正在尝试执行以下操作:
假设有一个外部模块mycalculator.lua,它有一个myadd(a,b)函数。
现在我想基本上还有两个使用mycalculator的文件A.lua和B.lua。他们都使用来自mycalculator的myadd(a,b),但有自己的函数mycalcA和mycalcB,我希望能够在C.lua的第三个函数中调用它们。我需要了解我必须如何加载这些以及按什么顺序加载。 C.lua中的需求依赖性是否正确?可以这样做还是循环?我也可以重载mycalc(a,b),因此它在A和B中都是相同的函数名吗?
-- A.lua
require 'mycalculator'
a=1;
b=2;
n=20;
function mycalcA(a,b)
return myadd(a,b)+20;
end
function A()
local A = {}
A.mycalcA = mycalcA
return A
end
-- B.lua
require 'mycalculator'
a=1;
b=2;
X=50;
function mycalcB(a,b)
return myadd(a,b)+50;
end
function B()
local B = {}
B.mycalcB = mycalcB
return B
end
-- C.lua
require 'A'
require 'B'
print(mycalcB(1,2))
print(mycalcA(1,2))
答案 0 :(得分:4)
B.lua(和A.lua同样):
require 'mycalculator'
local a=1;
local b=2;
local X=50;
local function mycalcB(a,b)
return myadd(a,b)+50;
end
B = {
mycalc = mycalcB
}
return B
C.lua:
require 'A'
require 'B'
print(B.mycalc(1,2))
print(A.mycalc(1,2))
答案 1 :(得分:2)
C.lua中的需求依赖性是否正确?可以这样做还是循环?
只是为了扩展约翰的答案。当您在lua中require
模块时,它首先检查该模块是否已经加载。循环依赖在这里不是问题,因为如果模块'A'首先加载mycalculator
而模块'B'在之后需要它,则lua VM将不再重新加载mycalculator
。
仅供参考,lua会跟踪通过表package.loaded
加载的模块。当新模块加载该表时,使用模块作为条目名称的新条目进行更新。尚未加载的模块在package.loaded
中没有条目,因此其值将为零。
你的代码中另一个微妙的事情是John纠正:
-- A.lua
require 'mycalculator'
a=1;
b=2;
n=20;
-- ...
-- B.lua
require 'mycalculator'
a=1;
b=2;
x=50;
-- ...
默认情况下,这些变量是全局变量。当你需要模块'A'和'B'时,这些变量将被转储到你的'C'模块的全局命名空间中,这可能不是你想要的。为了更好地划分区域化并将其保留在文件范围,只需将这些变量作为“local”的前缀,如John的示例所示。