Lua Academy · Lektion

Finaliserare med __gc

Registrera metametoder med __gc för rensning när objekt samlas in.

Lektion 3 av 413 steg

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: resource

Mö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
  })
end

Finalizer-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
  })
end

Begrä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
end

Praktiska 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.

Gratis att börja

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

  1. Grunderna i Lua:s skräpsamlare
  2. Svaga nycklar och svaga värden
  3. Finaliserare med __gc
  4. Undvika minnesläckor
← Tillbaka till Lua Academy