我在C中创建了一个userobject,作为其中的一部分,我创建了一个metatable来覆盖__tostring
,__index
等方法。但我注意到,它可以通过getmetatable()
检索对象的元表。如果myatable有一个getmetatable()
密钥,似乎可以使__metatable
返回任意表。我希望getmetatable()
返回nil
,所以我的第一个想法是在__metatable
添加nil
密钥,但这显然不起作用它实际上并没有将__metatable
键添加到metatable:
struct my_obj* obj = (struct my_obj*)lua_newuserdata(L, sizeof(struct my_obj));
if (luaL_newmetatable(L, "mymetatable") != 0) {
lua_pushliteral(L, "__metatable");
lua_pushnil(L);
lua_rawset(L, -3); /* will not work, can not add a nil... */
}
lua_setmetatable(L, -2);
这可以以某种方式完成,还是我必须坚持将空表填入__metatable
?
答案 0 :(得分:1)
如果表格有getmetatable
密钥,请重新定义__metatable
以返回nil。
答案 1 :(得分:0)
好问题。
在快速查看手册和相关代码的情况下,我没有看到任何方法让它在lua(5.1,5.2或5.3)中工作。
我想知道是否有__call
/等。您可以玩这些游戏来进行此项工作,但查找是原始的,并且不会进行太多的检查,而不是" nil"。