【问题标题】:LuaJ How to avoid overriding existing entries in Globals tableLuaJ 如何避免覆盖全局表中的现有条目
【发布时间】:2014-06-02 00:07:47
【问题描述】:

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

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

【问题讨论】:

    标签: lua luaj


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2020-01-22
      • 2021-11-10
      • 2015-05-15
      • 1970-01-01
      • 2020-10-30
      • 1970-01-01
      相关资源
      最近更新 更多