Sumar objetos
Parte de la sección Programación Orientada a Objetos del Journey de Lua de Coddy. Lección 26 de 70.
Ya has visto cómo los metamétodos como __tostring y __eq te permiten personalizar el comportamiento de los objetos. Ahora ampliaremos esto a las operaciones aritméticas, empezando por la suma.
El método metamágico __add define qué sucede cuando usas el operador + entre dos objetos. Cuando Lua encuentra a + b, busca __add en la metatabla de cualquiera de los operandos.
local Vector = {}
Vector.__index = Vector
function Vector:new(x, y)
local obj = {x = x, y = y}
setmetatable(obj, Vector)
return obj
end
function Vector.__add(v1, v2)
return Vector:new(v1.x + v2.x, v1.y + v2.y)
endObserva que __add está definido con un punto, no con dos puntos. Recibe ambos operandos como argumentos y debería devolver un objeto nuevo en lugar de modificar cualquiera de los originales. Esto mantiene la operación predecible y segura.
local a = Vector:new(3, 4)
local b = Vector:new(1, 2)
local c = a + b
print(c.x, c.y) -- Salida: 4 6La idea clave es que __add debe estar en la propia metatabla (aquí, Vector), no solo en el objeto. Como establecemos Vector como la metatabla de todas las instancias, todas comparten este comportamiento automáticamente.
Desafío
FácilConstruyamos una clase Vector que admita la suma mediante el operador +. Este es tu primer paso hacia la sobrecarga de operadores, haciendo que tus objetos funcionen de forma natural con los operadores integrados de Lua.
Organizarás tu código en dos archivos:
Vector.lua: Define tu clase Vector con componentesxyy. Incluye un constructor:new(x, y)e implementa el metamétodo__addpara que sumar dos vectores cree un vector nuevo con los componentes combinados. Recuerda que__addusa la sintaxis con punto (no con dos puntos) y recibe ambos operandos como argumentos.main.lua: Requiere tu módulo Vector, crea instancias de vectores y demuestra que sumarlas produce el resultado correcto.
Recibirás cuatro entradas:
- Componente x del primer vector
- Componente y del primer vector
- Componente x del segundo vector
- Componente y del segundo vector
En tu archivo principal, crea dos vectores con los componentes indicados, súmalos usando el operador + e imprime los valores x y y del vector resultante en líneas separadas.
Por ejemplo, si las entradas son 3, 4, 1, 2, la salida debería ser:
4
6El primer vector (3, 4) más el segundo vector (1, 2) equivale a un vector nuevo (4, 6).
Pruébalo tú mismo
-- Requiere el módulo Vector
local Vector = require('Vector')
-- Lee la entrada
local x1 = tonumber(io.read())
local y1 = tonumber(io.read())
local x2 = tonumber(io.read())
local y2 = tonumber(io.read())
-- TODO: Crea dos instancias de Vector usando los valores de entrada
-- TODO: Suma los dos vectores usando el operador +
-- TODO: Imprime los valores x e y del vector resultante en líneas separadas
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