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 для реализации функции загрузки.