【问题标题】:lua: how do I make getmetatable() return nil?lua:如何让 getmetatable() 返回 nil?
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    好问题。

    快速浏览一下手册和相关代码,我看不出有任何方法可以在 lua(5.1、5.2 或 5.3)中使用。

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

    【讨论】:

      猜你喜欢
      • 2016-06-28
      • 1970-01-01
      • 2018-05-02
      • 1970-01-01
      • 2020-01-05
      • 2021-07-15
      • 2018-09-16
      • 2017-07-03
      • 2013-09-02
      相关资源
      最近更新 更多