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é ocurre si quieres combinar un objeto con una cadena? El metamétodo __concat te permite definir exactamente cómo debe funcionar esto.
Cuando Lua encuentra a .. b y un operando 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
endObserva que la función comprueba qué operando 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 PhDAl igual que otros metamétodos de operadores, __concat utiliza la sintaxis de punto 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.
Desafío
FácilConstruyamos una clase Title que pueda integrarse naturalmente en expresiones de cadenas usando el operador ... Esto resulta útil cuando quieres combinar objetos con cadenas de una manera legible e intuitiva, como al añadir tratamientos o sufijos al título de una persona.
Organizarás tu código en dos archivos:
Title.lua: Define tu clase Title con un campotextque 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: Requiere tu módulo Title, crea una instancia del título y muestra la concatenación en ambas direcciones.
Recibirás tres entradas:
- El texto del título (por ejemplo, "Engineer")
- Una cadena de prefijo que se colocará antes del título (por ejemplo, "Senior ")
- Una cadena de sufijo que se colocará después del título (por ejemplo, " III")
En tu archivo principal, crea un Title con el texto proporcionado. Después realiza dos concatenaciones e imprime cada resultado en una línea separada:
- Concatena la cadena de prefijo con el objeto de título
- Concatena el objeto de 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 IIILa 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
-- Leer entradas
local titleText = io.read()
local prefix = io.read()
local suffix = io.read()
-- Requerir el módulo Title
local Title = require('Title')
-- TODO: Crear una instancia de Title con el titleText dado
-- TODO: Concatenar prefix con el objeto title e imprimir el resultado
-- TODO: Concatenar el objeto title con suffix e imprimir el resultado
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