gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:28:28 37 4
gpt4 key购买 nike

我正在尝试使用 Luaj + java 构建一个 Controller 。我有以下 java 类

public class Duck {
public void talk() { System.out.println("Duck quacks!"); }
public void walk() { System.out.println("Duck walks!"); }
}

public class Person {
public void talk() { System.out.println("Person talks!"); }
public void walk() { System.out.println("Person walks!"); }
}

以及 Controller 的以下 lua 脚本:

onTalk(obj) 
obj:talk();
end

onWalk(obj)
obj:walk();
end

理想情况下,我想定义一个 Controller (用 lua 编写),我将在其中保留所有程序逻辑,并且我想将该 Controller 的 API 公开给我的 java 代码。我试图使用以下方法:

ScriptEngineManager sem     = new ScriptEngineManager();
ScriptEngine engine = sem.getEngineByExtension(".lua");
ScriptEngineFactory factory = engine.getFactory();

// Script defined above
CompiledScript cs = ((Compilable)engine).compile(MY_LUA_SCRIPT);
SimpleBindings b = new SimpleBindings();

b = newSimpletBindings();

LuaValue onWalkHandler = (LuaValue)b.get("onWalk");
//func.call(LuaValue.valueOf(duck)); // Passing duck object does not work ???

我无法将对象传递给 LuaValue。如何将 java 对象传递给 lua 脚本?

PS:一般来说,在使用 Java 和嵌入式脚本时,人们是将函数捆绑在一个脚本中,还是每个回调都有一个单独的脚本?

最佳答案

我在搜索 条目并发现您没有得到答复。你的问题很有趣,让我搜索。然后我意识到它是 2 年前被问到的......我希望我的回答对其他人有用!代码基于luaj-3.0-alpha1。

我们需要一个有效的 Lua 脚本(你忘记了 function 关键字):

function onTalk(javaObj)
print(type(javaObj) .. " " .. tostring(javaObj))
print(javaObj.name)
javaObj:talk()
return true
end

function onWalk(javaObj)
javaObj:walk()
return 1, "km"
end

我添加了一点痕迹......我也制作了类似于您的类(class):

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");

我首先尝试使用 LuaValue luaDog = LuaValue.userdataOf(dog); 将这些 Java 对象转换为 Lua,但它不起作用:我们确实有用户数据,如跟踪所示,但没有元表,因此我们无法调用方法或访问字段。

经过大量搜索,我找到了正确的咒语:

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

我很欣赏 Luaj API...:-) 可能更适合 Java 程序员,而其他库似乎更针对 Lua/C 程序员...

关于java - 如何将对象传递给公开的 luaj 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12358047/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com