使用Luaj将参数传递给Lua函数

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:尝试索引?(一个函数值)

感谢您的帮助!

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

你可以通过这种方式传入任意数量的参数。

你对匿名函数的解释让我受益匪浅。针对你的代码,我还有一个问题:我能否将LUA脚本中定义的变量(例如 "test_string")读取到JAVA中? - Jerry Tian

-1

由于您收到的错误信息是

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

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

尝试在变量 script 中不使用 \n 并添加空格。像这样:

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

似乎不是这样。我得到了完全相同的错误。此外,如果脚本有什么问题,LuaC.compile调用不应该已经失败了吗? - nerdinand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接