如何调用__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");

但我得到的是实际函数而不是返回。

那么我如何让它被调用,这样我就可以得到零?所以它似乎没有元表?

只需重写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一样破坏代码。可以说,第一个是你应该使用的那个,但很可能有人在那里做第二个。

这也暗示用户有一个元表,只是他们不忙弄乱它。

最新更新