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 8Observa 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 2Estos 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.
Desafío
FácilEscribe 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
xeyestablecidas en las coordenadas proporcionadas - Crea una metatabla con
__mulque maneje la multiplicación entre un vector y un escalar - La función
__muldebe verificar qué operando es el número y cuál es la tabla - Devuelve una nueva tabla con
x = vec.x * scalarey = 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 vectory(número): La coordenada y del vectorscalar(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 8El 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 2Pruébalo tú mismo
function scaleVector(x, y, scalar)
-- Escribe el código aquí
end
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Logic & Flow
1Iteración avanzada de tablas
Iterar con pairs()Iterar con ipairs()pairs() vs. ipairs()Resumen - Ficha de personaje4Introducción a las Metatablas
¿Qué es una Metatabla?setmetatable y getmetatableEl metamétodo __indexEl metamétodo __newindexEl metamétodo __tostringMetamétodos aritméticos - Parte 1Metamétodos aritméticos - Parte 2Resumen - Tablas de solo lectura2Más funciones de la librería table
table.concat()Construcción de tablas y unpack()table.sort()Ordenamiento personalizado con funcionesRepaso - Tabla de puntuaciones altas