Menu
Coddy logo textTech

Metamétodos aritméticos - Parte 2

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

Basándose en la suma y la resta, también puedes definir el comportamiento de multiplicación y división para tus tablas usando los metamétodos __mul y __div. Estos funcionan de la misma manera que __add y __sub, pero responden a los operadores * y /.

El metamétodo __mul es particularmente útil cuando quieres escalar los valores de una tabla. Por ejemplo, multiplicar un vector por un número (llamado escalar) debería multiplicar cada componente:

local vector = {x = 3, y = 4}

local meta = {
    __mul = function(a, b)
        local scalar = type(a) == "number" and a or b
        local vec = type(a) == "table" and a or b
        return {x = vec.x * scalar, y = vec.y * scalar}
    end
}

setmetatable(vector, meta)

local scaled = vector * 2
print(scaled.x, scaled.y)  -- Salida: 6  8

Observa cómo la función comprueba qué operando es el número y cuál es la tabla. Esto permite que tanto vector * 2 como 2 * vector funcionen correctamente.

El metamétodo __div funciona de manera similar para la división:

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

setmetatable(vector, meta)

local divided = vector / 2
print(divided.x, divided.y)  -- Salida: 1.5  2

Estos metamétodos completan las operaciones aritméticas básicas para tus tipos personalizados, dándote control total sobre cómo se comportan los operadores matemáticos con tus tablas.

challenge icon

Desafío

Fácil

Escribe una función scaleVector que tome x, y y scalar y devuelva el vector escalado como una cadena formateada.

Crea una tabla de vector con las coordenadas dadas, adjunta una metatabla con el metamétodo __mul para habilitar la multiplicación escalar, multiplica el vector por el escalar usando el operador * y devuelve el resultado.

Lógica:

  • Crea una tabla de vector con las claves x e y establecidas en las coordenadas proporcionadas
  • Crea una metatabla con __mul que maneje la multiplicación entre un vector y un escalar
  • La función __mul debe verificar qué operando es el número y cuál es la tabla
  • Devuelve una nueva tabla con x = vec.x * scalar e y = vec.y * scalar
  • Adjunta la metatabla a la tabla del vector usando setmetatable()
  • Multiplica el vector por el escalar usando vector * scalar
  • Devuelve el resultado como una cadena en el formato "x y" (los valores x e y separados por un espacio)

Parámetros:

  • x (número): La coordenada x del vector
  • y (número): La coordenada y del vector
  • scalar (número): El valor escalar por el cual multiplicar el vector

Devuelve: El vector escalado como una cadena en el formato "x y" (string)

Hoja de referencia

Los metamétodos __mul y __div definen el comportamiento de la multiplicación y la división para las tablas, respondiendo a los operadores * y /.

El metamétodo __mul es útil para escalar los valores de una tabla. Al multiplicar un vector por un escalar, verifica cuál operando es el número y cuál es la tabla para permitir tanto vector * 2 como 2 * vector:

local vector = {x = 3, y = 4}

local meta = {
    __mul = function(a, b)
        local scalar = type(a) == "number" and a or b
        local vec = type(a) == "table" and a or b
        return {x = vec.x * scalar, y = vec.y * scalar}
    end
}

setmetatable(vector, meta)

local scaled = vector * 2
print(scaled.x, scaled.y)  -- Output: 6  8

El metamétodo __div funciona de manera similar para la división:

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

setmetatable(vector, meta)

local divided = vector / 2
print(divided.x, divided.y)  -- Output: 1.5  2

Pruébalo tú mismo

function scaleVector(x, y, scalar)
    -- 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