给定一个表格,有没有方法可以检查它是否是任何类的实例对象?
假设所有的类定义都长这样:
Class = {}
Class.__index = Class
function Class.new()
return setmetatable({}, Class) -- returns an instance
end
if getmetatable(thing) == Class then
但如果您使用某种继承,则可以尝试此方法
local A = {} A.__index = A
function A:new() return setmetatable({}, A) end
function A:foo() print('foo') end
local B = setmetatable({}, A) B.__index = B
function B:new() return setmetatable({}, B) end
function B:boo() print("boo") end
local function is_instance(o, class)
while o do
o = getmetatable(o)
if class == o then return true end
end
return false
end
local a = A:new()
local b = B:new()
a:foo()
b:foo()
b:boo()
print(is_instance(a, A))
print(is_instance(a, B))
print(is_instance(b, B))
print(is_instance(b, A))
getmetatable()
读取表的元表,并将接收到的表与您已知的类列表进行比较。__metatable
字段未设置为其他内容,在沙箱中未删除getmetatable()
等),而且您应该了解所有可用的类。