aoi*_*iee 7 lua class object instance
给定一个表,有没有办法检查它是否是任何类的实例对象?
假设所有类定义如下:
Class = {}
Class.__index = Class
function Class.new()
return setmetatable({}, Class) -- returns an instance
end
Run Code Online (Sandbox Code Playgroud)
我只使用 getmetatable 函数
if getmetatable(thing) == Class then
Run Code Online (Sandbox Code Playgroud)
但是如果您使用某种类型的继承,那么您可以尝试这个
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))
Run Code Online (Sandbox Code Playgroud)
理论上,您可以使用 读取表的元表getmetatable(),并将收到的表与您已知的类列表进行比较。
但这意味着元表不应受到保护(__metatable字段未设置为不同的内容,getmetatable()未在沙箱中删除等),并且您应该知道所有可用的类。
如果表上设置了一些元表,则并不意味着该表是类层次结构的一部分,或者根本不是类的一部分。它可能只是使用元表来解决自己的任务。
| 归档时间: |
|
| 查看次数: |
3507 次 |
| 最近记录: |