Передача аргументов в функцию lua с помощью luaj

Я пытаюсь вызвать функцию lua в программе Java, используя LuaJ. Это прекрасно работает, когда я не передаю аргументы замыканию:

String script = "print 'Hello World!'";
InputStream input = new ByteArrayInputStream(script.getBytes());
Prototype prototype = LuaC.compile(input, "script");
LuaValue globals = JsePlatform.standardGlobals();
LuaClosure closure = new LuaClosure(prototype, globals);
closure.call();

Но сейчас я пробую скрипт lua с функцией верхнего уровня, которая принимает аргумент, и я просто не могу понять, как передать аргумент из Java. Вот что я получил так далеко:

String script = "function something(argument)\n"+
                            "test_string = 'Hello World!'\n"+
                            "print(test_string)\n"+
                            "print(argument)\n"+
                "end";

InputStream input = new ByteArrayInputStream(script.getBytes());
Prototype prototype = LuaC.compile(input, "script");
LuaValue globals = JsePlatform.standardGlobals();
LuaClosure closure = new LuaClosure(prototype, globals);
closure.invokemethod("something", CoerceJavaToLua.coerce("Foo"));

Это приводит к исключению в строке invokemethod:

org.luaj.vm2.LuaError: попытка индексировать? (значение функции)

Спасибо за вашу помощь!

2 ответа

В lua область видимости верхнего уровня - это анонимная функция с переменными аргументами. Доступ к ним осуществляется с помощью... В вашем примере вам не нужна функция с именем что-то, сам чанк можно использовать как безымянную функцию.

Например, этот код в luaj-3.0-beta1

String script = "argument = ...\n"+
 "test_string = 'Hello World!'\n"+
 "print(test_string)\n"+
 "print(argument)\n";

Globals globals = JsePlatform.standardGlobals();
LuaValue chunk = globals.loadString(script, "myscript");
chunk.call( LuaValue.valueOf("some-arg-value") );

Произвел этот результат для меня:

Hello World!
some-arg-value

Таким способом вы можете передать любое количество аргументов.

Так как вы получаете

org.luaj.vm2.LuaError: попытка индексировать? (значение функции)

как ваша ошибка; это означает, что ваша функция вообще не создается.

Попробуй без \n и дать пробелы в переменной script, Как это:

String script = "function something(argument) " + 
        " test_string = 'Hello World!'; " + 
        " print( test_string ); " + 
        " print( argument ); " + 
        " end";
Другие вопросы по тегам