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

我是lua的新手,正在尝试以下操作:

假设有一个外部模块mycalculator.lua,它有一个函数myadd(a,b)。

现在,我想要两个文件A.lua和B.lua,它们都使用了myadd(a,b)函数,但拥有自己的函数mycalcA和mycalcB,我希望在C.lua的第三个函数中能够调用它们。我需要了解如何加载它们以及加载的顺序。C.lua中的依赖关系是否正确?这个循环可以完成吗?还可以在A和B中重载mycalc(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))

原文链接 https://stackoverflow.com/questions/8584632

点赞
stackoverflow用户4323
stackoverflow用户4323
  • 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))
2011-12-21 03:41:40
stackoverflow用户234175
stackoverflow用户234175

问题:在C.lua中的所需依赖关系正确吗?这可以做到还是循环的?

只是稍微扩展了John的回答。当你在Lua中要求加载一个模块时,它首先检查该模块是否已经加载。循环依赖关系在这里并不是问题,因为如果模块'A'在模块'B'之前加载'mycalculator',Lua VM不会重新加载'mycalculator'。

FYI,Lua通过表'package.loaded'跟踪已加载的模块。当加载一个新模块时,该表会更新一个新条目,其中模块是条目名称。尚未加载的模块将没有'package.loaded'中的条目,因此它的值将为nil。

您的代码中还有一个微妙的问题,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的示例所示。

2011-12-21 04:58:53