lua:如何让getmetatable()返回nil?

时间:2015-02-08 21:32:39

标签: lua override metatable

我在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

2 个答案:

答案 0 :(得分:1)

如果表格有getmetatable密钥,请重新定义__metatable以返回nil。

答案 1 :(得分:0)

好问题。

在快速查看手册和相关代码的情况下,我没有看到任何方法让它在lua(5.1,5.2或5.3)中工作。

我想知道是否有__call /等。您可以玩这些游戏来进行此项工作,但查找是原始的,并且不会进行太多的检查,而不是" nil"。