Finaliserare med __gc
Registrera metametoder med __gc för rensning när objekt samlas in.
Finaliserare med __gc är en gratis lektion i Lua Academy på CoddyKit. Detta är lektion 3 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Lua Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Lua Academy innehåller totalt 4 lektioner.
Vad är en finalizer?
En finalizer är en funktion som anropas av GC precis innan ett objekt frigörs. I Lua implementeras den via metametoden __gc i en tabells metatabell.
Ange en finalizer
Koppla en __gc-funktion till en metatabell före eller när objektet skapas.
local mt = {
__gc = function(self)
print("Finalizing:", self.name)
end
}
do
local obj = setmetatable({name = "resource"}, mt)
end
collectgarbage() -- prints: Finalizing: resourceMönster för resursrensning
Finalizers är idealiska för att frigöra externa resurser: filhandtag, databasanslutningar eller C-minne.
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
})
endFinalizer-ordning
Objekt med finalizers samlas in i omvänd ordning mot den de skapades i. Som standard körs en finalizer per GC-cykel.
Återuppståndelse
Om en finalizer sparar en referens till objektet (i en global variabel eller en upvalue) återuppstår objektet. Det får bara ett ytterligare finalizer-anrop när det slutligen samlas in.
Userdata och __gc
I C-tillägg är __gc på userdata det huvudsakliga sättet att frigöra C-minne. I ren Lua-kod använder tabeller samma mekanism via metatabeller.
Proxyobjekt för RAII
Skapa en proxytabell vars __gc stänger den verkliga resursen. Detta efterliknar RAII från C++.
local function scoped(resource, cleanup)
return setmetatable({resource}, {
__gc = function(self) cleanup(self[1]) end
})
endBegränsningar för finaliserare
Finaliserare bör inte: anropa coroutine-operationer, ge upp körningen eller anta någon ordning för vilka andra objekt som fortfarande finns. Håll dem enkla och korta.
Svaga tabeller och finaliserare
Objekt i svaga tabeller kan fortfarande finaliseras. Efter finaliseringen (och eventuell återupplivning) samlas de in fullständigt under nästa cykel.
toLua-skydd för finaliserare
Använd en boolesk flagga i finaliseraren för att förhindra dubbel rensning om objektet återupplivas.
local mt = {}
mt.__gc = function(self)
if not self._closed then
self._closed = true
-- cleanup...
end
endPraktiska råd
Föredra explicita metoder som :close() eller :destroy() för deterministisk rensning. Använd __gc som ett skydd mot oavsiktliga utelämnanden, inte som primär resurshantering.
Fråga om finaliserare
När anropas metametoden __gc?
Sammanfattning: finaliserare med __gc
Metametoden __gc körs precis innan ett objekt samlas in, vilket möjliggör resursrensning i RAII-stil. Använd den som ett skydd; föredra explicita close-/destroy-metoder för deterministisk resurshantering.
Lär dig Lua med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 40
- Lektioner
- 159
Vanliga frågor
Är lektionen ”Finaliserare med __gc” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Lua Academy, inklusive ”Finaliserare med __gc”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Lua Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Finaliserare med __gc”?
Registrera metametoder med __gc för rensning när objekt samlas in. Ni övar på Lua Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Lua Academy?
Du behöver inga förkunskaper. Utbildningen i Lua Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.
Hur lång tid tar lektionen ”Finaliserare med __gc”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Lua Academy-lektionen?
Ja. Varje Lua Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Grunderna i Lua:s skräpsamlare
- Svaga nycklar och svaga värden
- Finaliserare med __gc
- Undvika minnesläckor