Lua:我该如何让getmetatable()返回nil?

我在 C 中创建了一个用户对象,并创建了一个元表来覆盖诸如 __tostring__index 等方法。但是我注意到,可以通过 getmetatable() 检索对象的元表。似乎可以使 getmetatable() 返回任意表格,只要我的元表具有 __metatable 键。我希望 getmetatable() 返回 nil,所以我的第一个想法是添加一个 __metatable 键,带有 nil,但显然这并不能实际上将 __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 中?

点赞
用户258523
用户258523

很好的问题。

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

我曾想知道是否可以通过一些__call /等的操作来使其工作,但查找是原始的,并且除了“为空”之外并没有进行太多检查。

2015-02-08 22:27:41
用户107090
用户107090

重新定义 getmetatable 函数,如果表中有 __metatable 键,则返回 nil。

2015-02-09 00:02:28