【发布时间】:2015-02-09 08:02:28
【问题描述】:
我在 C 中创建了一个用户对象,作为其中的一部分,我创建了一个元表来覆盖 __tostring、__index 等方法。不过,我注意到可以通过 getmetatable() 检索对象的元表.如果我的元表有一个 __metatable 键,似乎可以让 getmetatable() 返回任意表。我想让getmetatable()返回nil,所以我的第一个想法是用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?
【问题讨论】:
-
{ __metatable = false }是否足够接近?
标签: lua overriding metatable