LuaJ(Java Lua库):从Lua文件中调用其他文件中的Lua函数

LuaJ (Java Lua Library): Calling Lua functions in other files from a Lua file

To begin, I'm aware of this question, but I don't think it quite fits what I'm doing. Either way, the answer is a bit confusing my opinion. I'd like to find an answer for my problem that's more specific to what I'm doing.

此处的目标是 lua 文件 chatterToolsTest 成功打印 "Test success" 到控制台。不幸的是,我目前的方法不太奏效。有人可以帮忙吗?我在 Lua 方面不是最好的,所以在这种情况下我的 Lua 代码可能是错误的。请查看下面的片段。

另一个限制: 我无法使用 java 端的模块。两个 Lua 文件之间的任何引用只能通过 Lua 获得。这是因为我正在为一个 Java 项目开发一个模组系统,并且需要 Lua 能够在 Java 端以最小的变化工作。

请记住,我没有将我的 Lua 文件存储在 JAR 文件或任何包中,它们包含在 Java program, like a folder of resources.

chatterToolsTest.lua:

function main()
  print("Test start.");

  local test = require("chatterTools");
  chatterTools:test();
end

chatterTools.luachatterToolsTest.lua调用的class:

function test()
  print("Test success");
end

这两个文件都在名为 world/NOKORIWARE/lua/:

的文件夹中

最后,这里是 Java 测试 class 使用 LuaJ 调用它们:

public class LuaTest {
    public static void main(String args[]) {
        new LuaTest().run("NOKORIWARE/lua/chatterToolsTest.lua", "main");
    }

    private Globals buildGlobals() {
        Globals globals = new Globals();

        globals.load(new JseBaseLib());
        globals.load(new PackageLib());
        globals.load(new Bit32Lib());
        globals.load(new TableLib());
        globals.load(new StringLib());
        globals.load(new JseMathLib());
        globals.load(new WhitelistedLuajavaLib());

        LoadState.install(globals);
        LuaC.install(globals);

        return globals;
    }

    /**
     * Runs the given lua file. It must be relative to the lua path.
     */
    private void run(String luaPath, String functionName, Object... arguments) {
        LuaValue[] coercedValues = null;

        if (arguments != null) {
            //Coerce arguments into LuaValues
            coercedValues = new LuaValue[arguments.length];

            for (int i = 0; i < arguments.length; i++) {
                coercedValues[i] = CoerceJavaToLua.coerce(arguments[i]);
            }
        }

        //Configure lua file
        Globals globals = buildGlobals();
        globals.get("dofile").call(LuaValue.valueOf("./world/" + luaPath));

        //Call the passed-in function of the lua file.
        try {
            LuaValue call = globals.get(functionName);
            if (arguments != null) {
                call.invoke(coercedValues);
            }else {
                call.invoke();
            }
        } catch (Exception e) {
            e.printStackTrace();
            TinyFileDialog.showMessageDialog("Caught " + e.getClass().getName(), e.getMessage(), TinyFileDialog.Icon.INFORMATION);
        }
    }
}

这是我 运行 Java 程序时打印的错误:

org.luaj.vm2.LuaError: @./world/NOKORIWARE/lua/chatterToolsTest.lua:4 module 'chatterTools' not found: chatterTools
    no field package.preload['chatterTools']
    chatterTools.lua
    no class 'chatterTools'
    at org.luaj.vm2.LuaValue.error(Unknown Source)
    at org.luaj.vm2.lib.PackageLib$require.call(Unknown Source)
    at org.luaj.vm2.LuaClosure.execute(Unknown Source)
    at org.luaj.vm2.LuaClosure.onInvoke(Unknown Source)
    at org.luaj.vm2.LuaClosure.invoke(Unknown Source)
    at org.luaj.vm2.LuaValue.invoke(Unknown Source)
    at nokori.robotfarm.test.LuaTest.run(LuaTest.java:64)
    at nokori.robotfarm.test.LuaTest.main(LuaTest.java:21)

感谢任何帮助或相关资源的链接。

默认的 LuaJ 工作目录与 Java 的相同。一旦我弄明白了,我就能够正确使用 require().

chatterTools.lua 更改为:

local chatterTools = {}

function chatterTools.test()
  print("Test success");
end

return chatterTools;

最后 chatterToolsTest.lua 必须这样改:

function main()
  print(package.path);

  local chatterTools = require("world.NOKORIWARE.lua.chatterTools");
  chatterTools:test();
end

Lua 像上面那样处理包,所以它不是 world/NOKORIWARE/lua/chatterTools.lua 而是你在 require() 调用中看到的。

经过这些更改后,我 运行 程序得到了以下内容:

?.lua
Test success

考虑到所有这些,这个解决方案比我在这个问题开头链接的问题中的答案 straight-forward 多得多。希望这会对你们中的一些人有所帮助。

要详细了解我是如何解决这个问题的,请查看这些资源:

how to call function between 2 .lua

https://forums.coronalabs.com/topic/38127-how-to-call-a-function-from-another-lua-file/