instanceofと型イントロスペクション
クラス階層をたどってinstanceof()検査を実装します。
「instanceofと型イントロスペクション」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
instanceofとは
instanceof(obj, Class) は、オブジェクトが特定のクラスまたはその祖先クラスのいずれかのインスタンスであるかをチェックします。OOPシステムでは、Luaの生の type() の代わりに使用します。
単純なinstanceof
インスタンスから上方向へメタテーブルチェーンをたどり、対象のクラスを探します。
local function instanceof(obj, cls)
if type(obj) ~= "table" then return false end
local mt = getmetatable(obj)
while mt do
if mt == cls then return true end
local parent = getmetatable(mt)
mt = parent and parent.__index
end
return false
endinstanceofのテスト
継承チェーン全体で正しく動作します。
local cat = Animal:new("Cat","Meow")
local rex = Dog:new("Rex")
print(instanceof(rex, Dog)) -- true
print(instanceof(rex, Animal)) -- true
print(instanceof(cat, Dog)) -- false__typeフィールドの規約
実行時の型チェックを高速化するため、各クラスに文字列形式の型名を格納します。
Animal.__type = "Animal"
Dog.__type = "Dog"
local function typeOf(obj)
local mt = getmetatable(obj)
return mt and mt.__type or type(obj)
end
print(typeOf(rex)) -- Dog型ガード
APIの境界でアサーションをわかりやすく行うために、型ガード関数を作成します。
local function assertType(obj, cls, argName)
if not instanceof(obj, cls) then
error(("Expected %s for %s, got %s"):format(
cls.__name, argName, typeOf(obj)), 2)
end
endクラス検出のためのgetmetatable
getmetatable(obj) はクラステーブルを返します。既知のクラスと比較すると、正確な型をテストできます(継承は考慮されません)。
local function exactType(obj)
return getmetatable(obj)
end
print(exactType(rex) == Dog) -- true
print(exactType(rex) == Animal) -- false (not exact)クラス階層のイントロスペクション
メタテーブルチェーンをたどり、オブジェクトが継承しているすべてのクラスを列挙します。
local function classChain(obj)
local chain = {}
local mt = getmetatable(obj)
while mt do
chain[#chain+1] = mt.__name or "?"
local parent = getmetatable(mt)
mt = parent and parent.__index
end
return chain
end型システムの比較
Lua組み込みの type() は、8つの基本型だけを返します。OOPシステムでは、クラス階層を理解する instanceof またはカスタムの typeOf 関数を使用します。
封印クラス
クラスから :extend() メソッドを削除するか、__index にチェックを追加して、サブクラス化を防ぎます。
型ベースのディスパッチ
実行時の型に基づいて関数呼び出しを振り分けます。メソッドオーバーロードに代わる軽量な方法です。
local function process(animal)
if instanceof(animal, Dog) then
print("Processing Dog:", animal.name)
elseif instanceof(animal, Animal) then
print("Processing Animal:", animal.name)
end
end型情報を使ったデバッグ
意味のあるデバッグ出力を得るため、型名を含む __tostring をクラスに追加します。
instanceofに関する質問
RexがAnimalを継承するDogである場合、instanceof(rex, Animal) は何を返しますか?
まとめ:instanceofと型イントロスペクション
instanceof はメタテーブルチェーンをたどり、継承を考慮した型チェックを行います。高速な文字列型検索には __type フィールドを使用します。APIの境界に型ガードを配置すると、明確なメッセージで型エラーを早期に検出できます。
よくある質問
「instanceofと型イントロスペクション」レッスンは無料ですか?
はい。「instanceofと型イントロスペクション」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「instanceofと型イントロスペクション」で何を学びますか?
クラス階層をたどってinstanceof()検査を実装します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「instanceofと型イントロスペクション」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 基底クラスとコンストラクターの設計
- 多段階継承
- Mixinの合成とインターフェース検査
- instanceofと型イントロスペクション