gpt4 book ai didi

java - LUAJ 强制 Java 对象不接受 LuaValue 参数

转载 作者:行者123 更新时间:2023-12-01 11:12:42 29 4
gpt4 key购买 nike

当 Java 代码明确要求 LuaValue 时,我遇到了 LuaJ 不接受 LuaValue 作为参数的问题。

public void registerEvent(LuaValue id, String event, String priority,
LuaValue callback)
{
if(!(id instanceof LuaTable))
{
throw new RuntimeException("id must be an LuaTable");
}
EventDispatcher.addHandler(id, event, priority, callback);
}

理想情况下,这将允许 Lua 中的代码简单地读起来像这样......

function main(this)
this.modName="Some Mod"
this.lastX = 0
hg.both.registerEvent(this, "inputcapturedevent", "last", eventRun)
end

function eventRun(this, event)
this.lastX += event.getX()
end

遗憾的是,这个简单的方法给出了一个错误,它需要用户数据,但得到了一个表。

org.luaj.vm2.LuaError: script:4 bad argument: userdata expected, got table

在这两种情况下,“this”的值是相同的 LuaTable,但是因为方法 registerEvent 是通过 CoerceJavaToLua.coerce(...) 添加的,所以它认为它需要一个 java 对象,而不是意识到它确实需要一个 LuaVale。

所以我的问题是这样的。有没有更好的方法来解决这个问题,让我可以使用 Java 和 Lua 中的相同功能?如果您从头到尾读完这里,感谢您抽出时间:)

最佳答案

您收到的错误可能是转移注意力的错误,可能是由于您将“registerEvent”函数绑定(bind)到“hg.both”的值的方式所致。可能您只需要使用方法语法,例如

hg.both:registerEvent(this, "inputcapturedevent", "last", eventRun)

如果您想使用点语法hg.both.registerEvent,那么使用 VarArgFunction 并实现 invoke() 可能是更直接的实现方法。在此示例中,Both.registerEvent 是一个普通变量,即 VarArgFunction。

public static class Both {
public static VarArgFunction registerEvent = new VarArgFunction() {
public Varargs invoke(Varargs args) {
LuaTable id = args.checktable(1);
String event = args.tojstring(2);
String priority = args.tojstring(3);
LuaValue callback = args.arg(4);
EventDispatcher.addHandler(id, event, priority, callback);
return NIL;
}
};
}

public static void main(String[] args) throws ScriptException {

ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine engine = sem.getEngineByName("luaj");
Bindings sb = engine.createBindings();

String fr =
"function main(this);" +
" this.modName='Some Mod';" +
" this.lastX = 0;" +
" hg.both.registerEvent(this, 'inputcapturedevent', 'last', eventRun);" +
"end;";
System.out.println(fr);

CompiledScript script = ((Compilable) engine).compile(fr);
script.eval(sb);
LuaFunction mainFunc = (LuaFunction) sb.get("main");

LuaTable hg = new LuaTable();
hg.set("both", CoerceJavaToLua.coerce(Both.class));
sb.put("hg", hg);

LuaTable library = new LuaTable();
mainFunc.call(CoerceJavaToLua.coerce(library));
}

关于java - LUAJ 强制 Java 对象不接受 LuaValue 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32166252/

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