LuaJ (библиотека Java Lua): вызов функций Lua из других файлов из файла Lua - PullRequest
0 голосов
/ 27 мая 2019

Для начала, я знаю об этом вопросе, но я не думаю, что он вполне соответствует тому, что я делаю. В любом случае, ответ немного сбивает с толку мое мнение. Я хотел бы найти ответ для своей проблемы, более конкретно относящийся к тому, что я делаю.

Цель для файла lua chatterToolsTest состоит в том, чтобы успешно вывести «Test success» на консоль. К сожалению, мой нынешний подход не совсем работает. Может кто-нибудь, пожалуйста, помогите? Я не лучший в Lua, так что, возможно, мой код Lua в этом случае просто неверен. Пожалуйста, ознакомьтесь с фрагментами ниже.

Еще одно ограничение: Я не могу включить использование модулей со стороны Java. Любые ссылки, сделанные между двумя файлами Lua, должны быть получены только через Lua. Это потому, что я разрабатываю систему моддинга для проекта Java, и мне нужен Lua, чтобы работать с минимальными изменениями на стороне Java.

Пожалуйста, имейте в виду, что я не храню мои файлы Lua внутри файла JAR или каких-либо пакетов, они содержатся в папке в корневом рабочем каталоге программы Java, например в папке ресурсов.

chatterToolsTest.lua

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

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

chatterTools.lua, класс называется chatterToolsTest.lua:

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

Оба эти файла находятся в папке с именем world/NOKORIWARE/lua/:

И, наконец, вот класс тестирования Java, использующий 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)

Любая помощь или ссылки на соответствующие ресурсы приветствуются.

1 Ответ

0 голосов
/ 27 мая 2019

Рабочий каталог 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

Учитывая все вышесказанное, это решение гораздо более прямолинейно, чем ответ на вопрос, который я связал в начале этого вопроса.Надеюсь, это поможет некоторым из вас там.

Чтобы узнать больше о том, как я понял это, посмотрите эти ресурсы:

как вызвать функцию между 2 .lua

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

...