LuaJ从两个不同的LuaScripts中加载两个具有相同名称的函数

时间:2014-02-27 15:38:19

标签: lua luaj

我有两个包含同名函数的Lua脚本:

luaScriptA:

function init() 
print( 'This function was run from Script A' )
end

luaScriptB:

function init() 
print( 'This function was run from Script B' )
end

我想使用LuaJ将这两个函数加载到globals环境中,对于一个脚本,我通常按如下方式执行:

LuaValue chunk = globals.load(new FileInputStream(luaScriptA), scriptName, "t",
globals);
chunk.call();

这会将函数init()加载到globals中,我可以用java执行这个函数:

globals.get("init").call();

当我加载第二个脚本时会出现问题,这将覆盖之前声明的具有相同名称的所有函数。有什么方法可以防止这种情况并轻松区分这两个功能吗?例如:

globals.get("luaScriptA").get("init").call(); //Access the init function of script A
globals.get("luaScriptB").get("init").call(); //Access the init function of script B

请注意,该脚本还包含其他功能,我的目标是在脚本中运行单个功能,而不是立即运行完整脚本。在JME平台上运行。

2 个答案:

答案 0 :(得分:2)

将您的功能放在表格中

luaScriptA:

A = {} -- "module"
function A.init() 
    print( 'This function was run from Script A' )
end

luaScriptB:

B = {} -- "module"
function B.init() 
    print( 'This function was run from Script B' )
end

然后你会做

globals.get("A").get("init").call();
globals.get("B").get("init").call();

答案 1 :(得分:0)

下面的代码在自己的环境中加载脚本,这些脚本继承自全局的脚本以供读取但不能用于写入。换句话说,您可以致电print但每个人都定义自己的init。你可能不得不在LuaJ中使用它,但我不知道是什么。

local function myload(f)
    local t=setmetatable({},{__index=_G})
    assert(loadfile(f,nil,t))()
    return t
end

local A=myload("luaScriptA")    A.init()
local B=myload("luaScriptA")    B.init()