0Pricing
Lua Academy · Lección

Finalizadores con __gc

Registre metamétodos __gc para realizar tareas de limpieza cuando se recolecten objetos.

Finalizadores con __gc es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Lua Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Lua Academy incluye 4 lecciones en total.

¿Qué es un finalizador?

Un finalizador es una función a la que llama el GC justo antes de liberar un objeto. En Lua, se implementa mediante el metamétodo __gc en la metatabla de una tabla.

Configuración de un finalizador

Asocie una función __gc a una metatabla antes de crear el objeto o durante su creación.

local mt = {
  __gc = function(self)
    print("Finalizing:", self.name)
  end
}
do
  local obj = setmetatable({name = "resource"}, mt)
end
collectgarbage()  -- prints: Finalizing: resource

Patrón de limpieza de recursos

Los finalizadores son ideales para liberar recursos externos: identificadores de archivos, conexiones de bases de datos o memoria de 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
  })
end

Orden de los finalizadores

Los objetos con finalizadores se recopilan en orden inverso al de su creación. De forma predeterminada, los finalizadores se ejecutan uno por ciclo del GC.

Resurrección

Si un finalizador almacena una referencia al objeto (en una variable global o un upvalue), el objeto resucita. Solo recibirá una llamada más al finalizador cuando finalmente se recopile.

Userdata y __gc

En las extensiones de C, __gc en userdata es la forma principal de liberar memoria de C. En código Lua puro, las tablas usan el mismo mecanismo mediante metatablas.

Objetos proxy para RAII

Cree una tabla proxy cuyo __gc cierre el recurso real. Esto imita RAII de C++.

local function scoped(resource, cleanup)
  return setmetatable({resource}, {
    __gc = function(self) cleanup(self[1]) end
  })
end

Limitaciones de los finalizadores

Los finalizadores no deben: llamar a operaciones de coroutine, producir valores con yield ni suponer ningún orden respecto a la existencia de otros objetos. Manténgalos simples y breves.

Tablas débiles y finalizadores

Los objetos de las tablas débiles aún pueden finalizarse. Después de la finalización (y una posible resurrección), se recopilan por completo en el siguiente ciclo.

Protección de finalizadores en toLua

Use una bandera booleana dentro del finalizador para evitar una doble limpieza en caso de resurrección.

local mt = {}
mt.__gc = function(self)
  if not self._closed then
    self._closed = true
    -- cleanup...
  end
end

Consejos prácticos

Prefiera métodos :close() o :destroy() explícitos para una limpieza determinista. Use __gc como red de seguridad para omisiones accidentales, no como mecanismo principal de gestión de recursos.

Pregunta sobre finalizadores

¿Cuándo se llama al metamétodo __gc?

Repaso: finalizadores con __gc

El metamétodo __gc se ejecuta justo antes de recopilar un objeto, lo que permite una limpieza de recursos al estilo de RAII. Úselo como red de seguridad; prefiera métodos explícitos de cierre o destrucción para gestionar los recursos de forma determinista.

Preguntas frecuentes

¿La lección «Finalizadores con __gc» es gratis?

Sí — el texto completo de «Finalizadores con __gc» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Lua Academy, actualiza a CoddyKit PRO. El curso de Lua Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Finalizadores con __gc»?

Registre metamétodos __gc para realizar tareas de limpieza cuando se recolecten objetos. Practicas Lua Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Lua Academy?

No se requiere experiencia previa. Lua Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Finalizadores con __gc»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Lua Academy?

Sí. Cada lección de Lua Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Conceptos básicos del recolector de basura de Lua
  2. Claves y valores débiles
  3. Finalizadores con __gc
  4. Cómo evitar fugas de memoria
← Volver a Lua Academy