LuaJ 如何避免覆盖全局表中现有的条目。

我正在使用LuaJ将不同的Lua脚本加载到Java中的全局环境中,如下所示:

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

我的问题是,如果例如scriptName恰好是require,print,error,math或任何其他已在调用globals = JmePlatform.standardGlobals()之后存在于globals中的名称,那么该脚本实际上会替换/覆盖实际功能,例如打印。

有没有简单的方法可以防止这种情况发生?

不幸的是,此类测试:

` if(globals.get(scriptName)!= Globals.NIL){ //然后不允许脚本加载 } `

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

点赞
用户646619
用户646619

我建议永远不要将库存储在全局范围内,就像这个原因一样。请参见 http://www.luafaq.org/#T1.37.2 ,了解使用 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() -- 输出 "bar!"

请参阅 require 的文档,了解如何实现加载函数。

2014-04-17 17:58:56