instanceof e introspezione dei tipi
Implementi verifiche instanceof() attraversando la gerarchia delle classi.
instanceof e introspezione dei tipi è una lezione Lua Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Lua Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Lua Academy include 4 lezioni in totale.
Che cos'è instanceof?
instanceof(obj, Class) verifica se un oggetto è un'istanza di una classe specifica o di uno dei suoi antenati. Nei sistemi OOP sostituisce il type() grezzo di Lua.
instanceof semplice
Percorra la catena delle metatabelle dall'istanza verso l'alto, cercando la classe di destinazione.
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
endVerifica di instanceof
Funziona correttamente lungo le gerarchie di ereditarietà.
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)) -- falseConvenzione del campo __type
Memorizzi il nome del tipo come stringa in ogni classe per eseguire rapidamente i controlli del tipo a runtime.
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)) -- DogGuardie di tipo
Crei funzioni guardia del tipo per eseguire asserzioni più chiare ai confini delle 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
endgetmetatable per rilevare le classi
getmetatable(obj) restituisce la tabella della classe. La confronti con una classe nota per verificare il tipo esatto (senza considerare l'ereditarietà).
local function exactType(obj)
return getmetatable(obj)
end
print(exactType(rex) == Dog) -- true
print(exactType(rex) == Animal) -- false (not exact)Introspezione della gerarchia delle classi
Percorra la catena delle metatabelle per elencare tutte le classi da cui un oggetto eredita.
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
endConfronto tra sistemi di tipi
Il type() integrato di Lua restituisce solo 8 tipi di base. Nei sistemi OOP, utilizzi instanceof o funzioni typeOf personalizzate che comprendano la gerarchia delle classi.
Classi sealed
Impedisca l'ereditarietà rimuovendo il metodo :extend() da una classe o aggiungendo un controllo in __index.
Dispatch basato sul tipo
Esegua il dispatch delle chiamate di funzione in base al tipo a runtime: un'alternativa leggera all'overloading dei metodi.
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
endDebug con informazioni sul tipo
Aggiunga __tostring alle classi includendo il nome del tipo, per ottenere un output di debug significativo.
Domanda su instanceof
Che cosa restituisce instanceof(rex, Animal) se Rex è un Dog (che estende Animal)?
Riepilogo: instanceof e introspezione dei tipi
instanceof percorre la catena delle metatabelle per verificare il tipo tenendo conto dell'ereditarietà. Utilizzi i campi __type per una ricerca rapida del tipo come stringa. Le guardie di tipo ai confini delle API rilevano presto gli errori di tipo e forniscono messaggi chiari.
Domande Frequenti
La lezione «instanceof e introspezione dei tipi» è gratuita?
Sì — il testo completo di «instanceof e introspezione dei tipi» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Lua Academy, passa a CoddyKit PRO. Il corso Lua Academy include 4 lezioni in totale.
Cosa imparerò in «instanceof e introspezione dei tipi»?
Implementi verifiche instanceof() attraversando la gerarchia delle classi. Eserciti Lua Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Lua Academy?
Non è richiesta alcuna esperienza precedente. Lua Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «instanceof e introspezione dei tipi»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Lua Academy?
Sì. Ogni lezione Lua Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Progettazione della classe base e del costruttore
- Ereditarietà multilivello
- Composizione dei mixin e verifica delle interfacce
- instanceof e introspezione dei tipi