El metamétodo __tostring
Parte de la sección Lógica y flujo de control del Journey de Lua de Coddy. Lección 20 de 54.
Cuando imprimes una tabla en Lua, normalmente ves algo poco útil como table: 0x5f8a20, simplemente una dirección de memoria. El metamétodo __tostring te permite cambiar este comportamiento definiendo exactamente qué debe mostrarse cuando tu tabla se convierte en una cadena.
Este metamétodo es especialmente útil para la depuración y para crear una salida más limpia. Cuando Lua necesita convertir tu tabla en una cadena (por ejemplo, al usar print()), comprueba si la tabla tiene una metatabla con un campo __tostring. Si lo tiene, Lua llama a esa función y usa su valor de retorno en lugar de la representación predeterminada.
Así es como se implementa:
local vector = {x = 3, y = 4}
local meta = {
__tostring = function(t)
return "Vector(" .. t.x .. ", " .. t.y .. ")"
end
}
setmetatable(vector, meta)
print(vector) -- Salida: Vector(3, 4)La función __tostring recibe la tabla como argumento y debe devolver una cadena. En este ejemplo, construye una cadena con formato que muestra los valores x e y del vector en un formato fácil de leer.
Esto hace que tu código sea mucho más fácil de manejar. En lugar de ver direcciones de memoria crípticas durante la depuración, obtienes información significativa sobre lo que contiene tu tabla.
Desafío
FácilEscribe una función createPoint que acepte las coordenadas x y y y devuelva una tabla de puntos con una representación de cadena personalizada.
Crea una tabla con los campos x y y, asígnale una metatabla con el metamétodo __tostring y devuelve el resultado de convertir la tabla en una cadena mediante tostring().
Lógica:
- Crea una tabla con las claves
xyyestablecidas en las coordenadas proporcionadas - Crea una metatabla con
__tostringque devuelva una cadena con el formato"Point(x, y)" - Asigna la metatabla a la tabla del punto mediante
setmetatable() - Devuelve
tostring(point)para obtener la representación de cadena personalizada
Parámetros:
x(número): La coordenada x del puntoy(número): La coordenada y del punto
Devuelve: La representación de cadena personalizada del punto con el formato "Point(x, y)" (cadena)
Pruébalo tú mismo
function createPoint(x, y)
-- 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 Lógica y flujo de control
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 altasPractica por tu cuenta: Compilador de Lua online