繁体   English   中英

Lua检查表是否是“实例”

[英]Lua check if a table is an 'instance'

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

假设所有的类定义如下:

Class = {}
Class.__index = Class

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

从理论上讲,您可以使用getmetatable()来读取表的元表,并比较接收到的表的类列表。

但这意味着不应该保护metatable( __metatable metatable字段未设置为其他内容, 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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM