Menu
Coddy logo textTech

Sumar objetos

Parte de la sección Object Oriented Programming 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 cómo se comportan los objetos. Ahora extenderemos esto a las operaciones aritméticas, comenzando con la suma.

El metamétodo __add define qué sucede cuando usas el operador + entre dos objetos. Cuando Lua ve 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)
end

Observa que __add está definido con un punto, no con dos puntos. Recibe ambos operandos como argumentos y debe devolver un nuevo objeto 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  6

La idea clave es que __add debe estar en la propia metatabla (aquí, Vector), no solo en el objeto. Dado que establecemos Vector como la metatabla para todas las instancias, todas comparten este comportamiento automáticamente.

challenge icon

Desafío

Fácil

Vamos a construir una clase Vector que admita la suma utilizando el operador +. Este es tu primer paso en la sobrecarga de operadores: hacer 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 los componentes x e y. Incluye un constructor :new(x, y) e implementa el metamétodo __add para que al sumar dos vectores se cree un nuevo vector con los componentes combinados. Recuerda que __add utiliza la sintaxis de punto (no de dos puntos) y recibe ambos operandos como argumentos.
  • main.lua: Requiere tu módulo Vector, crea instancias de vectores y demuestra que sumarlos produce el resultado correcto.

Recibirás cuatro entradas:

  1. Componente x del primer vector
  2. Componente y del primer vector
  3. Componente x del segundo vector
  4. Componente y del segundo vector

En tu archivo principal, crea dos vectores con los componentes dados, súmalos usando el operador + e imprime los valores x e y del vector resultante en líneas separadas.

Por ejemplo, si las entradas son 3, 4, 1, 2, la salida debería ser:

4
6

El primer vector (3, 4) más el segundo vector (1, 2) es igual a un nuevo vector (4, 6).

Hoja de referencia

El metamétodo __add define qué sucede cuando utilizas el operador + entre dos objetos.

Cuando Lua ve 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)
end

__add se define con un punto, no con dos puntos. Recibe ambos operandos como argumentos y debe devolver un nuevo objeto en lugar de modificar cualquiera de los originales.

local a = Vector:new(3, 4)
local b = Vector:new(1, 2)
local c = a + b

print(c.x, c.y)  -- Output: 4  6

__add debe estar en la propia metatabla, no solo en el objeto.

Pruébalo tú mismo

-- Requerir el módulo Vector
local Vector = require('Vector')

-- Leer la entrada
local x1 = tonumber(io.read())
local y1 = tonumber(io.read())
local x2 = tonumber(io.read())
local y2 = tonumber(io.read())

-- TODO: Crear dos instancias de Vector usando los valores de entrada

-- TODO: Sumar los dos vectores usando el operador +

-- TODO: Imprimir los valores x e y del vector resultante en líneas separadas
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 Object Oriented Programming