Menu
CoddyTech

Concatenar objetos

Parte de la sección Programación orientada a objetos del Journey de Lua de Coddy. Lección 28 de 70.

El operador .. en Lua concatena cadenas, pero ¿qué pasa si quieres combinar un objeto con una cadena? El metamétodo __concat te permite definir exactamente cómo debería funcionar esto.

Cuando Lua encuentra a .. b y uno de los operandos tiene un metamétodo __concat, llama a esa función con ambos valores. Esto resulta útil cuando quieres que los objetos se integren de forma natural en expresiones de cadenas.

local Name = {}
Name.__index = Name

function Name:new(first, last)
    local obj = {first = first, last = last}
    setmetatable(obj, Name)
    return obj
end

function Name.__concat(a, b)
    if type(a) == "string" then
        return a .. b.first .. " " .. b.last
    else
        return a.first .. " " .. a.last .. b
    end
end

Observa que la función comprueba cuál de los operandos es la cadena. Como .. puede usarse como "Hello " .. obj o obj .. "!", tu metamétodo debe manejar ambos casos.

local person = Name:new("Ada", "Lovelace")

print("Dr. " .. person)      -- Salida: Dr. Ada Lovelace
print(person .. " PhD")      -- Salida: Ada Lovelace PhD

Al igual que otros metamétodos de operadores, __concat se escribe con un punto por convención y recibe ambos operandos como argumentos. La diferencia clave con los metamétodos aritméticos es que normalmente trabajas con tipos mixtos: tu objeto y una cadena.

challenge icon

Desafío

Fácil

Vamos a crear una clase Title que pueda integrarse de forma natural en expresiones de cadenas usando el operador ... Esto resulta útil cuando quieres combinar objetos con cadenas de manera legible e intuitiva, por ejemplo, al añadir tratamientos honoríficos o sufijos al título de una persona.

Organizarás el código en dos archivos:

  • Title.lua: Define tu clase Title con un campo text que almacene la cadena del título. Incluye un constructor :new(text) e implementa el metamétodo __concat. Tu metamétodo debe manejar ambos casos: cuando una cadena aparece antes del objeto ("prefix" .. obj) y cuando una cadena aparece después (obj .. "suffix"). El resultado debe combinar la cadena con el texto del título de forma adecuada.
  • main.lua: Importa tu módulo Title, crea una instancia del título y muestra la concatenación en ambas direcciones.

Recibirás tres entradas:

  1. El texto del título (por ejemplo, "Engineer")
  2. Una cadena de prefijo para colocar antes del título (por ejemplo, "Senior ")
  3. Una cadena de sufijo para colocar después del título (por ejemplo, " III")

En tu archivo principal, crea un Title con el texto dado. Después, realiza dos concatenaciones e imprime cada resultado en una línea aparte:

  1. Concatena la cadena de prefijo con el objeto del título
  2. Concatena el objeto del título con la cadena de sufijo

Por ejemplo, si las entradas son Engineer, Senior y III, la salida debería ser:

Senior Engineer
Engineer III

La primera línea muestra el prefijo combinado con el título, y la segunda línea muestra el título combinado con el sufijo. ¡Tu metamétodo __concat hace posible esta combinación natural de cadenas!

Pruébalo tú mismo

-- Lee las entradas
local titleText = io.read()
local prefix = io.read()
local suffix = io.read()

-- Carga el módulo Title
local Title = require('Title')

-- TODO: Crea una instancia de Title con el titleText proporcionado

-- TODO: Concatena prefix con el objeto title e imprime el resultado

-- TODO: Concatena el objeto title con suffix e imprime el resultado
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