3

我在 C 中创建了一个用户对象,作为其中的一部分,我创建了一个元表来覆盖诸如__tostring__index等方法。不过,我注意到可以通过getmetatable(). 如果我的元表有键,似乎可以getmetatable()返回任意表。__metatable我想getmetatable()返回nil,所以我的第一个想法是添加一个__metatablenil,但这显然不起作用,因为它实际上并没有将__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

4

2 回答 2

1

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

于 2015-02-09T00:02:28.850 回答
0

好问题。

快速浏览一下所涉及的手册和代码,我看不出有任何方法可以让它在 lua(5.1、5.2 或 5.3)中工作。

我想知道是否有一些__call/ etc。你可以玩游戏来完成这项工作,但查找是原始的,除了“is nil”之外没有做太多检查。

于 2015-02-08T22:27:41.963 回答