2013-01-24 4 views
5

Sto provando a chiamare una funzione lua in un programma Java utilizzando LuaJ. Funziona bene quando non sto passando alcun argomento alla chiusura:Passare argomenti a una funzione lua con 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(); 

Ma ora sto cercando uno script lua con una funzione di primo livello, che prende un argomento e io non riesco a capire come passare l'argomento da Java. Ecco quello che ho ottenuto finora:

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

Ciò si traduce in un'eccezione sulla linea InvokeMethod:

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

Grazie per il vostro aiuto!

risposta

0

Dal momento che si riceve

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

come il vostro errore; questo significa che la tua funzione non viene creata affatto.

Provalo senza \n e inserisci gli spazi nella variabile script. Come questo:

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

Quello non sembra essere quello. Sto ottenendo lo stesso identico errore. Inoltre, se lo script non fosse corretto in qualche modo, la chiamata a LuaC.compile non dovrebbe già fallire? – nerdinand

3

in Lua, l'ambito di primo livello è una funzione anonima con argomenti variabili. Questi sono accessibili usando ... Nel tuo esempio, non hai bisogno della funzione chiamata qualcosa, il chunk stesso può essere usato come una funzione senza nome.

Ad esempio, questo codice 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")); 

Produzioni risultato per me:

Hello World! 
some-arg-value 

È possibile passare in qualsiasi numero di argomenti in questo modo.

+0

la tua spiegazione sulla funzione anonima ha chiarito molte cose. Ho un'altra domanda sul codice: posso leggere la variabile definita nello script LUA in JAVA, come la variabile "test_string"? –