我的目标
获取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
一样破坏代码。可以说,第一个是你应该使用的那个,但很可能有人在那里做第二个。
这也暗示用户有一个元表,只是他们不忙弄乱它。