【发布时间】:2015-09-17 18:36:40
【问题描述】:
In chapter 13.2 of Programming in Lua 据说
与算术元方法不同,关系元方法不支持混合类型。
同时
Lua 仅在被比较的两个对象共享此元方法时才调用相等元方法
所以我正在用 C 实现我的库,并希望能够支持像
这样的行为a = A()
b = B()
a == b
通过提供
static const struct luaL_Reg mylib_A[] =
{
{ "__eq", my_equal }
, <more stuff>
, { NULL, NULL }
};
和
static const struct luaL_Reg mylib_B[] =
{
{ "__eq", my_equal }
, <more stuff>
, { NULL, NULL }
};
这似乎不起作用,有解决方法吗?
注意:my_equal 能够在它的任何参数中处理 A 类型和 B 类型的用户数据
更新: 元表注册:
luaL_newmetatable(lua, "B");
lua_pushvalue(lua, -1);
lua_setfield(lua, -2, "__index");
luaL_register(lua, NULL, mylib_B);
luaL_newmetatable(lua, "A");
lua_pushvalue(lua, -1);
lua_setfield(lua, -2, "__index");
luaL_register(lua, NULL, mylib_A);
luaL_register(lua, "mylib", mylib); -- where mylib is a bunch of static functions
应用代码:
require 'mylib'
a = mylib.new_A()
b = mylib.new_B()
a == b -- __eq is not called
【问题讨论】:
-
你用的是什么版本的lua?
-
我正在尝试同时支持 5.1 和 5.2
-
您是在对象的元表中还是在对象的方法/等中设置
__eq?表本身? -
@whoever:据我所知,您发布的代码应该可以工作,也许您可以发布 MWE?
-
@EtanReisner 我正在使用旧式 luaL_register(L, NULL, mylib_A) 来注册元表、luaL_getmetatable 和 lua_setmetatble 以创建用户数据对象,如果这有助于使其更清晰