Java LuaJ overwrite.new()
我试图用LuaJ覆盖.new()lua函数(方法?)。 我试图在metatable中为我的表设置一个“new”键,但在lua中调用.new()时,它被忽略,并运行默认的java支持的函数,将表创建为java对象 如果我将键重命名为(例如)“new2”,并使用“table.new2()”创建它,那么它就可以正常工作 希望有人能帮我 迄今为止的代码:Java LuaJ overwrite.new(),java,metatable,luaj,Java,Metatable,Luaj,我试图用LuaJ覆盖.new()lua函数(方法?)。 我试图在metatable中为我的表设置一个“new”键,但在lua中调用.new()时,它被忽略,并运行默认的java支持的函数,将表创建为java对象 如果我将键重命名为(例如)“new2”,并使用“table.new2()”创建它,那么它就可以正常工作 希望有人能帮我 迄今为止的代码: LuaValue vectorClass = CoerceJavaToLua.coerce(Vector3Lua.class); lu
LuaValue vectorClass = CoerceJavaToLua.coerce(Vector3Lua.class);
luaj.globals.set("Vector3", vectorClass);
LuaTable table = new LuaTable();
table.set("new2", new ThreeArgFunction() {
public LuaValue call(LuaValue x, LuaValue y, LuaValue z) {
System.out.println("Created new Vector: " + x + ", " + y + ", " + z);
return LuaValue.NIL;
}
});
table.set("__index", table);
vectorClass.setmetatable( table );
Lua测试仪:
local test1 = Vector3.new(2, 3, 4); --> Does not print test message
local test2 = Vector3.new2(4, 4, 4); --> Does print test message
这样做的原因是,我可以对自动创建的“Vector3”的每个实例应用元表,从而对用户隐藏内部功能。不幸的是,我对LuaJ了解不够,无法给您一个好的答案,但是我可以告诉您,您当前的解决方案将不起作用,因为当访问一个已经不存在的密钥时,实际上会调用
\u index
。在您的情况下,由于已存在vectorClass.new
,因此在执行代码Vector3.new
时不会调用\uu索引。除此之外,您是否不能说类似于vectorClass.set(“new”,--[[function here]])
?解决方案不是使用强制Ejavatola()。为了获得所需的功能,我必须创建一个扩展LuaValue的Vector类。从那里我可以设置元表,然后创建一个.new()方法。不幸的是,我对LuaJ了解不够,无法给您一个好的答案,但我可以告诉您,您当前的解决方案将不起作用,因为当访问一个已经不存在的键时,实际上会调用\u index
。在您的情况下,由于已存在vectorClass.new
,因此在执行代码Vector3.new
时不会调用\uu索引。除此之外,您是否不能说类似于vectorClass.set(“new”,--[[function here]])
?解决方案不是使用强制Ejavatola()。为了获得所需的功能,我必须创建一个扩展LuaValue的Vector类。从那里我可以设置元表,然后创建一个.new()方法。