从两个不同的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将这两个函数加载到全局环境中,对于一个脚本,我通常会这样做:

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

这将加载init()函数到全局中,我可以使用以下方式在Java中执行此函数:

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

当我加载第二个脚本时,问题就出现了,这将覆盖以前声明的所有相同名称的函数。是否有任何方式可以防止这种情况并轻松区分这两个函数?例如类似于:

globals.get("luaScriptA").get("init").call(); //访问脚本A中的init函数
globals.get("luaScriptB").get("init").call(); //访问脚本B中的init函数

请注意,脚本还包含其他函数,我的目标是单独运行脚本中的各个函数,而不是一次性运行完整的脚本。 在JME平台上工作。

点赞
用户869951
用户869951

将你的函数放在表格中

luaScriptA:

A = {} -- "module"
function A.init()
    print( '此函数来自脚本A' )
end

luaScriptB:

B = {} -- "module"
function B.init()
    print( '此函数来自脚本B' )
end

然后你将执行:

globals.get("A").get("init").call();
globals.get("B").get("init").call();
2014-02-27 16:20:43
用户107090
用户107090

下面的代码将脚本加载到它们自己的环境中,该环境从全局环境继承以进行读取,但不是写入。换句话说,您可以调用 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()
2014-02-27 16:54:54