如何使 __metatable 函数被调用?

我的目标

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 呢?所以它似乎没有元表?

点赞
用户4984564
用户4984564

只需重写 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-19 13:51:08