Claves y valores débiles
Cree tablas débiles con __mode='k', 'v' o 'kv' para estructuras similares a cachés.
Claves y valores débiles es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 2 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é son las tablas débiles?
Una tabla débil contiene referencias que no impiden la recolección de basura. Los objetos de las tablas débiles pueden recopilarse aunque la tabla siga existiendo.
El metamétodo __mode
Establezca __mode en la metatabla para controlar la debilidad: "k" para claves débiles, "v" para valores débiles y "kv" para ambos.
local weakValues = setmetatable({}, {__mode = "v"})
local weakKeys = setmetatable({}, {__mode = "k"})Ejemplo de valores débiles
Una caché cuyos valores pueden recopilarse cuando no existen otras referencias.
local cache = setmetatable({}, {__mode = "v"})
local function getObject(key)
if not cache[key] then
cache[key] = {data = key} -- expensive to create
end
return cache[key]
endTras el GC, desaparecen los valores débiles
Cuando la única referencia a un objeto se encuentra en una tabla de valores débiles, el GC lo recopila y la entrada desaparece.
local t = setmetatable({}, {__mode = "v"})
do
local obj = {}
t[1] = obj
print(t[1]) -- table: 0x...
end
collectgarbage()
print(t[1]) -- nil (collected)Ejemplo de claves débiles
Las claves débiles permiten asociar metadatos a objetos sin impedir que se recopilen. Cuando se recopila el objeto clave, se elimina la entrada.
local meta = setmetatable({}, {__mode = "k"})
local function attachMeta(obj, data)
meta[obj] = data
endPatrón de anotación de objetos
Anote objetos con datos adicionales mediante una tabla de claves débiles. Cuando se recopila el objeto, la anotación se elimina automáticamente.
local annotations = setmetatable({}, {__mode = "k"})
annotations[myObj] = {created = os.time(), owner = "Alice"}
print(annotations[myObj].owner)Tablas de claves y valores débiles
Una tabla "kv" tiene claves y valores débiles. Solo las claves que están vivas (referenciadas en otro lugar) mantienen sus entradas.
Tablas ephemeron
En Lua 5.2 y versiones posteriores, las tablas de claves débiles son ephemerons: si la única referencia al valor pasa por la clave, ambos se recopilan juntos. Esto evita una retención inesperada.
Patrón de caché con valores débiles
El uso habitual: una caché de memorización que libera los resultados almacenados cuando se necesita memoria, sin expulsión manual.
local function weakMemo(fn)
local cache = setmetatable({}, {__mode = "v"})
return function(x)
if not cache[x] then cache[x] = fn(x) end
return cache[x]
end
endLimitaciones
Las tablas débiles no pueden contener tipos primitivos (números, booleanos y cadenas) como valores débiles, ya que no se pueden recopilar mediante el GC (las cadenas están internadas).
Cuándo usar tablas débiles
- Cachés de objetos que deben liberar memoria bajo presión.
- Asociación de metadatos con objetos externos.
- Implementación de tablas de internamiento para objetos personalizados.
Pregunta sobre tablas débiles
¿Qué hace __mode = "v" en una metatabla?
Resumen: claves y valores débiles
Las tablas débiles usan __mode = "k", "v" o "kv" para permitir que el GC recopile sus claves o valores. Esto es esencial para crear cachés seguras en cuanto a memoria y patrones de anotación de objetos.
Preguntas frecuentes
¿La lección «Claves y valores débiles» es gratis?
Sí — el texto completo de «Claves y valores débiles» 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 «Claves y valores débiles»?
Cree tablas débiles con __mode='k', 'v' o 'kv' para estructuras similares a cachés. 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 2 de 4.
¿Cuánto tiempo toma la lección «Claves y valores débiles»?
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
- Conceptos básicos del recolector de basura de Lua
- Claves y valores débiles
- Finalizadores con __gc
- Cómo evitar fugas de memoria