Передача аргументов в функцию 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";