0Pricing
Lua Academy · Lezione

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
end

Verifica 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))     -- false

Convenzione 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))  -- Dog

Guardie 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
end

getmetatable 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
end

Confronto 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
end

Debug 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

  1. Progettazione della classe base e del costruttore
  2. Ereditarietà multilivello
  3. Composizione dei mixin e verifica delle interfacce
  4. instanceof e introspezione dei tipi
← Torna a Lua Academy