1

我的目标

获取getmetatable返回分配给该__metatable字段的函数的返回值。

代码:

local x, m = {}, {__metatable = function() return nil end};
setmetatable(x, m);
io.write("Let's get the metatable:", tostring(getmetatable(x)), "\n");

但我得到的是实际功能而不是返回。

那么我如何让它被调用所以我可以得到 nil 呢?所以它似乎没有元表?

4

1 回答 1

2

只需重写 getmetatable 以按照您希望的方式工作;)

do local getmetatable = getmetatable
   function _G.getmetatable(tab)
      local meta = getmetatable(tab)
      if type(meta)=='function' then
         return meta(tab)
      else
         return meta
      end
   end
end

或者,您可以设置__metatable为 false。这适用于编写类似的代码if getmetatable(foo) then,但会破坏类似的代码if getmetatable(foo) == false。可以说,第一个是您应该使用的,但可能有人在做第二个。

这也会向用户暗示存在一个元表,只是他们不忙于弄乱它。

于 2019-09-19T13:51:08.227 回答