Menu
Coddy logo textTech

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 .. ")"
end

Ahora, 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.

challenge icon

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 clase Book con el patrón de prototipo estándar. Cada libro debe almacenar un title y un author. Incluye un constructor :new(title, author) e implementa el metamétodo __tostring para 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:

  1. Título del primer libro
  2. Autor del primer libro
  3. Título del segundo libro
  4. 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 Orwell

Recuerda 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))

quiz iconPonte a prueba

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

Practica por tu cuenta: Compilador de Lua online