如何将对象传递给公开的luaj函数?

如何将对象传递给公开的luaj函数?,第1张

如何将对象传递给公开的luaj函数?

我正在搜索luaj条目,但未找到答案。您的问题很有趣,让我搜寻。然后我意识到这是两年前提出来的……我希望我的回答对其他人有用!基于luaj-3.0-alpha1的代码。

我们需要一个有效的Lua脚本(您忘记了

function
关键字):

function onTalk(javaObj)  print(type(javaObj) .. " " .. tostring(javaObj))  print(javaObj.name)  javaObj:talk()  return trueendfunction onWalk(javaObj)  javaObj:walk()  return 1, "km"end

我添加了一些跟踪信息…我也制作了类似于您的类:

class Dog{  public String name;  Dog(String n) { name = n; }  public void talk() { System.out.println("Dog " + name + " barks!"); }  public void walk() { System.out.println("Dog " + name + " walks..."); }}class Cat{  String name;  Cat(String n) { name = n; }  public void talk() { System.out.println("Cat " + name + " meows!"); }  public void walk() { System.out.println("Cat " + name + " walks..."); }}

也添加一个字段来对此进行测试。为了进行测试,我只是在创建实例的方法中声明了这些类:

Dog dog = new Dog("Rex");Cat cat = new Cat("Felix");

我首先尝试使用将这些Java对象转换为Lua,

LuaValue luaDog =LuaValue.userdataOf(dog);
但它不起作用:正如跟踪所示,我们确实有用户数据,但是没有metatable,因此我们既不能调用方法也不能访问字段。

经过大量搜索后,我发现了正确的咒语:

Compiledscript script = ((Compilable) scriptEngine).compile(reader);Bindings sb = new SimpleBindings();script.eval(sb); // Put the Lua functions into the sb environmentLuaValue luaDog = CoerceJavaToLua.coerce(dog); // Java to LuaLuaFunction onTalk = (LuaFunction) sb.get("onTalk"); // Get Lua functionLuaValue b = onTalk.call(luaDog); // Call the functionSystem.out.println("onTalk answered: " + b);LuaFunction onWalk = (LuaFunction) sb.get("onWalk");LuaValue[] dogs = { luaDog };Varargs dist = onWalk.invoke(LuaValue.varargsOf(dogs)); // AlternativeSystem.out.println("onWalk returned: " + dist);

我感谢Luaj API … :-)可能是为Java程序员制作的,而其他库似乎更多是为Lua / C程序员设计的…



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5616222.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存