1

我正在使用 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();

,该脚本实际上将替换/覆盖实际功能,例如打印。

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

不幸的是,一个测试如:

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

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

4

1 回答 1

1

正是出于这个原因,我建议永远不要将库存储在全局范围内。有关使用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 的文档以实现加载功能。

于 2014-04-17T17:58:56.660 回答