我正在使用LuaJ将不同的Lua脚本加载到全局环境中,如下所示:
globals = JmePlatform.standardGlobals();
LuaValue chunk = globals.load(new FileInputStream(luaScriptA), scriptName, "t", globals);
chunk.call();
我的问题是,例如,如果scriptName恰好是 require,print,error,math 或者在调用
之后已经存在于globals中的任何其他名称globals = JmePlatform.standardGlobals();
,该脚本实际上将替换/覆盖实际功能,例如print。
有没有简单的方法可以防止这种情况发生?
不幸的是测试如:
if (globals.get(scriptName) != Globals.NIL) {
//then dont allow script load
}
对我来说不起作用,因为在脚本更新时,有些情况下它应该实际覆盖现有脚本。
答案 0 :(得分:1)
我建议永远不要将库存储在全局范围内,正是出于这个原因。有关使用required
加载模块和库的方法,请参阅http://www.luafaq.org/#T1.37.2。我不确定这是否适用于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!"
请参阅documentation of require以实现加载功能。