LuaJ如何避免覆盖Globals表中的现有条目

时间:2014-04-17 15:55:32

标签: lua luaj

我正在使用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
}

对我来说不起作用,因为在脚本更新时,有些情况下它应该实际覆盖现有脚本。

1 个答案:

答案 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以实现加载功能。