2013-01-24 10 views
5

Próbuję wywołać funkcję lua w programie Java za pomocą LuaJ. To działa dobrze, gdy nie mam żadnych argumentów przechodząc do zamknięcia:Podawanie argumentów funkcji lua z 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(); 

Ale teraz staram skrypt lua z funkcją najwyższego poziomu, który przyjmuje argument, a ja po prostu nie może dowiedzieć się, w jaki sposób przekazać argument z Javy. Oto co mam do tej pory:

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")); 

Powoduje to wyjątek na linii invokemethod:

org.luaj.vm2.LuaError: attempt to index ? (a function value)

Dzięki za pomoc!

Odpowiedz

0

Od pojawić

org.luaj.vm2.LuaError: attempt to index ? (a function value)

jako błędu; oznacza to, że twoja funkcja wcale nie jest tworzona.

Wypróbuj bez \n i podaj spacje w zmiennej script. W ten sposób:

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

To chyba nie jest to. Otrzymuję dokładnie ten sam błąd. Ponadto, jeśli skrypt nie był w jakiś sposób poprawny, czy nie powinno zadzwonić połączenie LuaC.compile? – nerdinand

3

W lua zasięg najwyższego poziomu to anonimowa funkcja ze zmiennymi argumentami. Dostęp do nich można uzyskać za pomocą ... W twoim przykładzie nie potrzebujesz funkcji o nazwie coś, porcja sama może być użyta jako funkcja bez nazwy.

Na przykład ten kod w 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")); 

Produced ten wynik dla mnie:

Hello World! 
some-arg-value 

można przejść w dowolnej liczbie argumentów w ten sposób.

+0

twoje wyjaśnienie na anonimową funkcję wyczyściło wiele rzeczy. Mam jeszcze jedno pytanie do ciebie: czy mogę wczytać zmienną zdefiniowaną w skrypcie LUA z powrotem do JAVA, jak zmienną "test_string"? –

Powiązane problemy