LuaJ Как избежать переопределения существующих записей в таблице Globals

Я загружаю различные сценарии Lua, использующие LuaJ, в глобальную среду следующим образом в Java:

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

Моя проблема заключается в том, что если, например, имя_скрипта окажется нужным , print, error, math или любое другое имя, которое уже существует в глобалах после вызова

globals = JmePlatform.standardGlobals();

скрипт фактически заменит / переопределит реальную функциональность, такую ​​как печать.

Есть ли простой способ предотвратить это?

К сожалению, такой тест, как:

if (globals.get(scriptName) != Globals.NIL) {
    //then dont allow script load
}

не будет работать для меня, так как есть случаи, когда он должен переопределить существующий скрипт, когда скрипт обновляется.

1 ответ

Я рекомендую никогда не хранить библиотеки в глобальном масштабе, именно по этой причине. См. http://www.luafaq.org/ для способа загрузки модулей и библиотек с использованием required, Я не уверен, что это работает на LuaJ, но если это реализует require правильно, вы можете сделать функцию загрузчика и поместить ее в package.loaders,

По сути, вы определяете свои библиотеки следующим образом:

-- foo.lua
local M = {}

function M.bar()
    print("bar!")
end

return M

И импортировать их так:

-- main.lua
local Foo = require "foo"
Foo.bar() -- prints "bar!"

См. Документацию require для реализации функции загрузки.

Другие вопросы по тегам