5

LuaJ を使用して Java プログラムで lua 関数を呼び出そうとしています。クロージャーに引数を渡していない場合は正常に機能します。

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: インデックスを作成しようとしていますか? (関数値)

ご協力いただきありがとうございます!

4

2 に答える 2

4

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

この方法で任意の数の引数を渡すことができます。

于 2013-07-06T20:01:42.740 に答える
-1

いただいてから

org.luaj.vm2.LuaError: インデックスを作成しようとしていますか? (関数値)

あなたのエラーとして; これは、関数がまったく作成されていないことを意味します。

なしで試して\n、変数にスペースを入れてくださいscript。このような:

String script = "function something(argument) " + 
        " test_string = 'Hello World!'; " + 
        " print( test_string ); " + 
        " print( argument ); " + 
        " end";
于 2013-01-24T15:35:55.223 に答える