setmetatable y getmetatable
Parte de la sección Logic & Flow del Journey de Lua de Coddy — lección 17 de 54.
Ahora que entiendes qué son las metatablas conceptualmente, es hora de aprender cómo trabajar realmente con ellas. Lua proporciona dos funciones esenciales para esto: setmetatable() para adjuntar una metatabla a una tabla, y getmetatable() para recuperarla.
Para adjuntar una metatabla a una tabla, se utiliza setmetatable(). Esta función toma dos argumentos: la tabla que desea modificar (la tabla principal) y la metatabla que desea adjuntarle:
local myTable = {name = "Alice"}
local myMetatable = {}
setmetatable(myTable, myMetatable)En este ejemplo, myMetatable ahora está adjunta a myTable. La metatable en sí está vacía por ahora, pero esto establece la conexión entre las dos tablas. La función setmetatable() también devuelve la tabla principal, lo que permite encadenar la operación si es necesario.
Para obtener la metatabla asociada a una tabla, utiliza getmetatable():
local retrievedMeta = getmetatable(myTable)
print(retrievedMeta == myMetatable) -- Salida: trueEsta función devuelve la metatabla si hay una adjunta, o nil si la tabla no tiene metatabla. Esto es útil cuando necesitas comprobar o modificar la metatabla de una tabla después de que haya sido establecida.
Comprender estas dos funciones es la base de todo el trabajo con metatablas en Lua. Una vez que puedas adjuntar y recuperar metatablas, estarás listo para definir metamétodos que cambien el comportamiento de tus tablas.
Desafío
FácilEscribe una función attachMetatable que reciba mainTable y metaTable y devuelva true si la metatabla se adjuntó correctamente.
Usa setmetatable() para adjuntar la metatabla a la tabla principal, luego verifica la unión usando getmetatable().
Lógica:
- Adjunta
metaTableamainTableusandosetmetatable() - Recupera la metatabla adjunta usando
getmetatable() - Compara la metatabla recuperada con la
metaTableoriginal - Devuelve
truesi coinciden,falsede lo contrario
Parámetros:
mainTable(table): La tabla a la que se le adjuntará la metatablametaTable(table): La metatabla a adjuntar
Devuelve: true si la metatabla se adjuntó y verificó correctamente, false de lo contrario (boolean)
Hoja de referencia
Lua proporciona dos funciones esenciales para trabajar con metatables:
setmetatable() - Adjunta una metatable a una tabla. Toma dos argumentos: la tabla principal y la metatable a adjuntar. Devuelve la tabla principal.
local myTable = {name = "Alice"}
local myMetatable = {}
setmetatable(myTable, myMetatable)getmetatable() - Recupera la metatable adjunta a una tabla. Devuelve la metatable si hay una adjunta, o nil si la tabla no tiene metatable.
local retrievedMeta = getmetatable(myTable)
print(retrievedMeta == myMetatable) -- Salida: truePruébalo tú mismo
function attachMetatable(mainTable, metaTable)
-- Escribe el código aquí
end
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Logic & Flow
1Iteración avanzada de tablas
Iterar con pairs()Iterar con ipairs()pairs() vs. ipairs()Resumen - Ficha de personaje4Introducción a las Metatablas
¿Qué es una Metatabla?setmetatable y getmetatableEl metamétodo __indexEl metamétodo __newindexEl metamétodo __tostringMetamétodos aritméticos - Parte 1Metamétodos aritméticos - Parte 2Resumen - Tablas de solo lectura2Más funciones de la librería table
table.concat()Construcción de tablas y unpack()table.sort()Ordenamiento personalizado con funcionesRepaso - Tabla de puntuaciones altas