LuaJ загружает две функции с одинаковыми именами из двух разных LuaScripts

У меня есть два сценария Lua, содержащие функции с одинаковыми именами:

луаСкриптА:

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() в глобальные переменные, и я могу выполнить эту функцию из 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.


person AvdB    schedule 27.02.2014    source источник


Ответы (2)


Поместите свои функции в таблицу

луаСкриптА:

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();
person Oliver    schedule 27.02.2014

Приведенный ниже код загружает скрипты в свою собственную среду, которая наследуется от глобальной для чтения, но не для записи. Другими словами, вы можете вызывать 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()
person lhf    schedule 27.02.2014