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 中,顶级作用域是一个带有可变参数的匿名函数。这些可以使用 ... 在您的示例中,您不需要名为 something 的函数,块本身可以用作未命名的函数。

例如,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 回答