如何从多个来源的外部库调用lua函数?

时间:2011-12-21 03:10:24

标签: lua

我是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))

2 个答案:

答案 0 :(得分:4)

  • C.lua中的需求依赖性是否正确?可以这样做还是循环?
    • 你看起来很好。
  • 我可以重载mycalc(a,b),因此它在A和B中都是相同的函数名吗?
    • 如果没有其他更改,我认为没有意义,这将是A和B中的定义范围,并从每个更改表。这看起来像这样:

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的示例所示。