使用luaj将参数传递给lua函数

我正在尝试使用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: attempt to index ? (a function value)

感谢您的帮助!

点赞
用户1190388
用户1190388

因为你收到了以下错误:

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

意味着你的函数根本没有被创建。

尝试去掉脚本中的 \n 并在变量 script 中添加空格。像这样:

String script = "function something(argument) " +
        " test_string = 'Hello World!'; " +
        " print( test_string ); " +
        " print( argument ); " +
        " end";
2013-01-24 15:35:55
用户2556943
用户2556943

在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-06 20:01:42