2013-01-24 7 views
5

Ich versuche, eine Lua-Funktion in einem Java-Programm mit LuaJ aufzurufen. Es funktioniert gut, wenn ich keine Argumente zur Schließung vorbei:Übergabe von Argumenten an eine Lua-Funktion mit 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(); 

Aber jetzt habe ich ein Lua Script mit einer Top-Level-Funktion bin versucht, die ein Argument nimmt und ich kann einfach nicht herausfinden, wie das Argument von Java übergeben. Hier ist, was ich bisher habe:

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

Dies führt zu einer Ausnahme auf der InvokeMethod Linie:

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

Vielen Dank für Ihre Hilfe!

Antwort

0

Da Sie erhalten

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

als Fehler; Das bedeutet, dass Ihre Funktion überhaupt nicht erstellt wird.

Versuchen Sie es ohne \n und geben Sie Leerzeichen in der Variablen script. Wie folgt:

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

Das scheint nicht zu sein. Ich bekomme genau den gleichen Fehler. Auch wenn das Skript irgendwie nicht korrekt war, sollte der Aufruf von LuaC.compile nicht fehlschlagen? – nerdinand

3

In lua ist der Top-Level-Bereich eine anonyme Funktion mit variablen Argumenten. Auf diese wird mit ... zugegriffen. In Ihrem Beispiel benötigen Sie die Funktion nicht, die etwas genannt wird, der Chunk selbst kann als unbenannte Funktion verwendet werden.

Zum Beispiel dieser Code in 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")); 

dieses Ergebnis für mich Produziert:

Hello World! 
some-arg-value 

Sie in einer beliebigen Anzahl von Argumenten auf diese Weise passieren kann.

+0

Ihre Erklärung zur anonymen Funktion hat eine Menge Dinge geklärt. Ich habe eine andere Frage über Sie Code: Kann ich die Variable in LUA-Skript wieder in JAVA wie die "test_string" Variable lesen? –