Finalizzatori con __gc
Registri metametodi __gc per la pulizia quando gli oggetti vengono raccolti.
Finalizzatori con __gc è una lezione Lua Academy gratuita su CoddyKit. Questa è la lezione 3 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'è un finalizer?
Un finalizer è una funzione chiamata dal GC subito prima che un oggetto venga liberato. In Lua viene implementato tramite il metametodo __gc nella metatabella di una tabella.
Impostazione di un finalizer
Collegate una funzione __gc a una metatabella prima o durante la creazione dell'oggetto.
local mt = {
__gc = function(self)
print("Finalizing:", self.name)
end
}
do
local obj = setmetatable({name = "resource"}, mt)
end
collectgarbage() -- prints: Finalizing: resourcePattern per la pulizia delle risorse
I finalizer sono ideali per rilasciare risorse esterne: handle di file, connessioni al database o memoria C.
local function openResource(path)
local f = io.open(path, "r")
return setmetatable({handle = f, path = path}, {
__gc = function(self)
if self.handle then
self.handle:close()
print("Closed:", self.path)
end
end
})
endOrdine dei finalizer
Gli oggetti con finalizer vengono raccolti in ordine inverso rispetto alla loro creazione. Per impostazione predefinita, i finalizer vengono eseguiti uno per ciclo del GC.
Resurrezione
Se un finalizer memorizza un riferimento all'oggetto (in una variabile globale o in un upvalue), l'oggetto viene resuscitato. Riceverà un'unica ulteriore chiamata al finalizer quando verrà infine raccolto.
Userdata e __gc
Nelle estensioni C, __gc sui userdata è il metodo principale per liberare la memoria C. Nel codice Lua puro, le tabelle usano lo stesso meccanismo tramite le metatabelle.
Oggetti proxy per RAII
Create una tabella proxy il cui __gc chiuda la risorsa reale. Questo riproduce il comportamento di RAII di C++.
local function scoped(resource, cleanup)
return setmetatable({resource}, {
__gc = function(self) cleanup(self[1]) end
})
endLimitazioni dei finalizzatori
I finalizzatori non devono: eseguire operazioni su coroutine, sospendersi con yield o presupporre un ordine specifico per la permanenza in vita degli altri oggetti. Li mantenga semplici e brevi.
Tabelle deboli e finalizzatori
Gli oggetti nelle tabelle deboli possono comunque essere finalizzati. Dopo la finalizzazione e un'eventuale resurrezione, vengono raccolti completamente nel ciclo successivo.
Protezione del finalizzatore di toLua
Utilizzi un flag booleano all'interno del finalizzatore per impedire una doppia pulizia in caso di resurrezione.
local mt = {}
mt.__gc = function(self)
if not self._closed then
self._closed = true
-- cleanup...
end
endConsigli pratici
Preferisca i metodi espliciti :close() o :destroy() per un rilascio deterministico delle risorse. Utilizzi __gc come rete di sicurezza per le omissioni accidentali, non come meccanismo principale di gestione delle risorse.
Domanda sui finalizzatori
Quando viene chiamato il metametodo __gc?
Riepilogo: finalizzatori con __gc
Il metametodo __gc viene eseguito subito prima che un oggetto venga raccolto, consentendo un rilascio delle risorse nello stile RAII. Lo utilizzi come rete di sicurezza; preferisca i metodi espliciti close/destroy per una gestione deterministica delle risorse.
Domande Frequenti
La lezione «Finalizzatori con __gc» è gratuita?
Sì — il testo completo di «Finalizzatori con __gc» è 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 «Finalizzatori con __gc»?
Registri metametodi __gc per la pulizia quando gli oggetti vengono raccolti. 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 3 di 4.
Quanto tempo richiede la lezione «Finalizzatori con __gc»?
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
- Nozioni di base sul garbage collector di Lua
- Chiavi e valori deboli
- Finalizzatori con __gc
- Prevenzione delle perdite di memoria