Lua检查表是否是'实例'

问题描述:

给定一个表,有没有办法检查它是否是任何类的实例对象?Lua检查表是否是'实例'

假设所有的类定义是这样的:

Class = {} 
Class.__index = Class 

function Class.new() 
    return setmetatable({}, Class) -- returns an instance 
end 

从理论上讲,你可以用getmetatable()读表的元表,并收到比较表agains已知你类别列表。

但这意味着metatable不应该被保护(__metatable字段没有设置不同的东西,getmetatable()不会被删除沙箱内,等等),你应该知道所有可用的类。

如果表上有一些metatable集,它并不意味着该表是类层次结构或类的一部分。它可能会使用metatables来解决自己的任务。

+0

'debug.getmetatable'在这种情况下使用。 – moteus

我只使用getmetatable功能

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))