Menu
Coddy logo textTech

Metamétodos aritméticos - Parte 1

Parte de la sección Logic & Flow del Journey de Lua de Coddy — lección 21 de 54.

Has aprendido a personalizar lo que sucede cuando imprimes una tabla usando __tostring. Ahora descubrirás que las metatablas también pueden definir lo que sucede cuando usas operadores aritméticos como + y - en tus tablas.

Normalmente, si intentas sumar dos tablas con el operador +, Lua te dará un error porque no sabe cómo sumar tablas. Pero con los metamétodos aritméticos, puedes definir exactamente qué significa la suma para tus tipos de datos personalizados.

El metamétodo __add controla el comportamiento de la suma. Cuando Lua encuentra el operador + entre dos valores y al menos uno tiene una metatabla con __add, llama a esa función en lugar de producir un error:

local v1 = {x = 3, y = 4}
local v2 = {x = 1, y = 2}

local meta = {
    __add = function(a, b)
        return {x = a.x + b.x, y = a.y + b.y}
    end
}

setmetatable(v1, meta)
setmetatable(v2, meta)

local v3 = v1 + v2
print(v3.x, v3.y)  -- Salida: 4  6

La función __add recibe dos argumentos: el operando izquierdo y el operando derecho. En este ejemplo, crea una nueva tabla con valores x e y que son la suma de los valores correspondientes de ambas tablas de entrada.

De manera similar, el metamétodo __sub controla la resta con el operador -:

local meta = {
    __sub = function(a, b)
        return {x = a.x - b.x, y = a.y - b.y}
    end
}

setmetatable(v1, meta)
setmetatable(v2, meta)

local v3 = v1 - v2
print(v3.x, v3.y)  -- Salida: 2  2

Esta capacidad de definir el comportamiento personalizado de los operadores se llama sobrecarga de operadores.

challenge icon

Desafío

Fácil

Escribe una función addVectors que tome x1, y1, x2 y y2 y devuelva el resultado de sumar dos vectores.

Crea dos tablas de vectores con las coordenadas dadas, adjunta una metatabla con el metamétodo __add para habilitar la suma de vectores, súmalos usando el operador + y devuelve el resultado como una cadena formateada.

Lógica:

  • Crea la primera tabla de vector con las claves x = x1 e y = y1
  • Crea la segunda tabla de vector con las claves x = x2 e y = y2
  • Crea una metatabla con __add que tome dos vectores y devuelva una nueva tabla con x = a.x + b.x e y = a.y + b.y
  • Adjunta la metatabla a ambas tablas de vectores usando setmetatable()
  • Suma los dos vectores usando v1 + v2
  • Devuelve el resultado como una cadena en el formato "x y" (los valores x e y separados por un espacio)

Parámetros:

  • x1 (número): La coordenada x del primer vector
  • y1 (número): La coordenada y del primer vector
  • x2 (número): La coordenada x del segundo vector
  • y2 (número): La coordenada y del segundo vector

Devuelve: La suma de los dos vectores como una cadena en el formato "x y" (string)

Hoja de referencia

Las metatablas pueden definir qué sucede cuando usas operadores aritméticos como + y - en tablas. Esto se llama sobrecarga de operadores.

El metamétodo __add controla el comportamiento de la suma con el operador +:

local v1 = {x = 3, y = 4}
local v2 = {x = 1, y = 2}

local meta = {
    __add = function(a, b)
        return {x = a.x + b.x, y = a.y + b.y}
    end
}

setmetatable(v1, meta)
setmetatable(v2, meta)

local v3 = v1 + v2
print(v3.x, v3.y)  -- Salida: 4  6

La función __add recibe dos argumentos: el operando de la izquierda y el operando de la derecha.

El metamétodo __sub controla la resta con el operador -:

local meta = {
    __sub = function(a, b)
        return {x = a.x - b.x, y = a.y - b.y}
    end
}

setmetatable(v1, meta)
setmetatable(v2, meta)

local v3 = v1 - v2
print(v3.x, v3.y)  -- Salida: 2  2

Pruébalo tú mismo

function addVectors(x1, y1, x2, y2)
    -- Escribe el código aquí
end
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 Logic & Flow