2017-07-19 9 views
1

テーブルがあれば、どのクラスのインスタンスオブジェクトであるかをチェックする方法はありますか?あなたはgetmetatable()とテーブルのメタテーブルを読んで、あなたに知られているクラスの受信テーブルagainsリストを比較することができ理論的にはテーブルが 'インスタンス'であるかどうかを確認する

Class = {} 
Class.__index = Class 

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

答えて

2

は、すべてのクラス定義がどのように見えるとします。

しかし、それは保護されてはならないことを意味します(__metatableフィールドは別のものに設定されておらず、getmetatable()はサンドボックス内などで削除されません)。

テーブルにいくつかのメタテーブルセットがある場合、それはテーブルがクラス階層の一部であるということを意味するものではありません。メタタブを使用して独自のタスクを解決することができます。

+0

を試すことができます。 – moteus

1

私は

if getmetatable(thing) == Class then 

だけgetmetatable機能を使用しかし、あなたは継承のいくつかのタイプを使用している場合、あなたは `debug.getmetatable`はこの場合に使用することができ、この1

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)) 
関連する問題