Lua检查表是否是'实例'

时间:2017-07-19 14:02:19

标签: class object lua instance

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

假设所有类定义如下:

Class = {}
Class.__index = Class

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

2 个答案:

答案 0 :(得分:2)

理论上,您可以使用getmetatable()读取表格的元表,并比较已知的类列表。

但这意味着metatable不应受到保护(__metatable字段未设置为不同的内容,getmetatable()未在沙箱中删除等),并且您应该知道所有可用的类。

如果表上有某个元表集,则并不意味着表是类层次结构的一部分,或者根本不是类。它可能只使用元数据来解决自己的任务。

答案 1 :(得分:2)

我只使用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))