Menu
CoddyTech

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 metamétodo __add define lo que ocurre 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)
end

Observa que __add se define con un punto. Lua pasa ambos operandos como argumentos simples, y la forma con punto les asigna nombre a ambos. También se podría usar dos puntos, ya que function Vector:__add(other) es lo mismo que function Vector.__add(self, other), pero la forma con punto es la convención. __add debería devolver un objeto nuevo en lugar de modificar cualquiera de los originales. Esto hace que la operación sea 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. Como establecemos Vector como metatabla de todas las instancias, todas comparten este comportamiento automáticamente.

challenge icon

Desafío

Fácil

Vamos a crear una clase Vector que permita sumar usando el operador +. Este es tu primer paso hacia la sobrecarga de operadores, que permite 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. Define __add con un punto, para que ambos operandos se reciban como argumentos con nombre.
  • main.lua: Requiere el módulo Vector, crea instancias de vectores y demuestra que al sumarlos se obtiene 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 indicados, 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).

Pruébalo tú mismo

-- Importa 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
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