Formateo de Strings
Parte de la sección Programación Orientada a Objetos del Journey de Lua de Coddy. Lección 16 de 70.
Cuando haces print de un objeto directamente, Lua muestra algo poco útil como table: 0x55a.... Solo una dirección de memoria. El metamétodo __tostring te permite definir exactamente qué cadena representa tu objeto cuando se imprime o se convierte en texto.
En el patrón de clase, añades __tostring como una función en la tabla de tu clase. Como la clase misma sirve como metatabla para las instancias, Lua encuentra y utiliza automáticamente esta función:
local Player = {}
Player.__index = Player
function Player:new(name, level)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.level = level
return instance
end
function Player:__tostring()
return "Player: " .. self.name .. " (Level " .. self.level .. ")"
endAhora, cuando imprimes una instancia de Player, Lua llama automáticamente a tu método __tostring:
local hero = Player:new("Luna", 5)
print(hero) -- Salida: Player: Luna (Level 5)Observa que __tostring usa la sintaxis de dos puntos y recibe self, lo que te da acceso a todos los datos de la instancia. La función debe devolver una cadena. Puedes darle el formato que tenga sentido para tu objeto, combinando cualquier atributo en una representación legible.
Desafío
Fácil¡Construyamos una clase Book que sepa presentarse! Cuando imprimas un libro directamente, Lua mostrará una cadena con un formato agradable en lugar de una críptica dirección de memoria: todo gracias al metamétodo __tostring.
Organizarás tu código en dos archivos:
Book.lua: Define tu claseBookcon el patrón de prototipo estándar. Cada libro debe almacenar untitley unauthor. Incluye un constructor:new(title, author)e implementa el metamétodo__tostringpara que imprimir un libro muestre su información en un formato legible.main.lua: Requiere tu módulo Book, crea instancias de libros e imprímelas directamente para ver en acción tu formato de cadena personalizado.
Tu método __tostring debe devolver una cadena con este formato exacto:
"[title]" by [author]Observa que el título está entre comillas dobles dentro de la cadena de salida.
Recibirás cuatro entradas:
- Título del primer libro
- Autor del primer libro
- Título del segundo libro
- Autor del segundo libro
En tu archivo principal, crea dos libros usando las entradas proporcionadas e imprime cada libro directamente (no llamando a un método, solo print(book)). Cada libro debe aparecer en su propia línea.
Por ejemplo, si las entradas son The Hobbit, J.R.R. Tolkien, 1984 y George Orwell, la salida debe ser:
"The Hobbit" by J.R.R. Tolkien
"1984" by George OrwellRecuerda que __tostring debe devolver una cadena y, puesto que la tabla de tu clase sirve como metatabla para las instancias, Lua encontrará y usará automáticamente tu función __tostring cuando imprimas un libro.
Pruébalo tú mismo
-- Requiere el módulo Book
local Book = require('Book')
-- Lee las entradas
local title1 = io.read()
local author1 = io.read()
local title2 = io.read()
local author2 = io.read()
-- TODO: Crea dos instancias de libro usando Book:new()
-- TODO: Imprime cada libro directamente (solo usa print(book))
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1El concepto de 'self'
Tablas con funciones'self' explícitoLa sintaxis de dos puntosPunto vs. dos puntosResumen - Punto en movimiento4Proyecto: Banco Digital
Configuración del proyectoMétodo de depósito2Patrón de prototipo de clase
El concepto de prototipoVinculación con __indexEl constructor :new()Inicialización de atributosInstancias independientesResumen - Fábrica de coches5Sobrecarga de operadores en POO
Sumar objetosRestar objetosConcatenar objetosComparar objetos (<, >)Resumen - Matemáticas de la billetera8Encapsulamiento
Convenciones de nomenclaturaClosures para privacidadAcceso mediante ClosuresTablas de solo lecturaLógica de validaciónResumen - Bóveda segura11Patrones de diseño (Lite)
Funciones FactoryTabla SingletonPatrón IteradorObserver (Listener)Resumen - Logger Factory3Estado y Comportamiento de los Objetos
Variables de InstanciaMétodos GetterMétodos SetterPropiedades CalculadasFormateo de StringsComprobaciones de IgualdadResumen - Calificación del Estudiante6Fundamentos de la herencia
Configuración de la herenciaHerencia de métodosExtender el constructorAñadir métodos hijosCompartido vs. ÚnicoResumen: Jerarquía de formasPractica por tu cuenta: Compilador de Lua online