Metametodi aritmetici - Parte 2
Fa parte della sezione Logica e flusso del percorso Lua di Coddy. Lezione 22 di 54.
Partendo da addizione e sottrazione, puoi anche definire il comportamento di moltiplicazione e divisione per le tue tabelle usando i metametodi __mul e __div. Funzionano allo stesso modo di __add e __sub, ma rispondono agli operatori * e /.
Il metametodo __mul è particolarmente utile quando vuoi scalare i valori di una tabella. Per esempio, moltiplicare un vettore per un numero (chiamato scalare) dovrebbe moltiplicare ogni 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) -- Output: 6 8Nota come la funzione controlla quale operando è il numero e quale è la tabella. Questo permette sia a vector * 2 sia a 2 * vector di funzionare correttamente.
Il metametodo __div funziona in modo simile per la divisione:
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) -- Risultato: 1.5 2Questi metametodi completano le operazioni aritmetiche di base per i tuoi tipi personalizzati, dandoti il pieno controllo sul comportamento degli operatori matematici con le tue tabelle.
Sfida
FacileScrivi una funzione scaleVector che accetta x, y e scalar e restituisce il vettore scalato come stringa formattata.
Crea una tabella vettore con le coordinate fornite, associa una metatabella con il metametodo __mul per abilitare la moltiplicazione per uno scalare, moltiplica il vettore per lo scalare usando l'operatore * e restituisci il risultato.
Logica:
- Crea una tabella vettore con le chiavi
xeyimpostate sulle coordinate fornite - Crea una metatabella con
__mulche gestisce la moltiplicazione tra un vettore e uno scalare - La funzione
__muldovrebbe controllare quale operando è il numero e quale è la tabella - Restituisci una nuova tabella con
x = vec.x * scalarey = vec.y * scalar - Associa la metatabella alla tabella vettore usando
setmetatable() - Moltiplica il vettore per lo scalare usando
vector * scalar - Restituisci il risultato come stringa nel formato
"x y"(i valori x e y separati da uno spazio)
Parametri:
x(numero): La coordinata x del vettorey(numero): La coordinata y del vettorescalar(numero): Il valore scalare per cui moltiplicare il vettore
Restituisce: Il vettore scalato come stringa nel formato "x y" (stringa)
Provalo tu
function scaleVector(x, y, scalar)
-- Escribe el código aquí
end
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Iterazione avanzata delle tabelle
Iterare con pairs()Iterare con ipairs()pairs() vs. ipairs()Riepilogo - Scheda del personaggio4Introduzione alle metatabelle
Che cos’è una metatabella?setmetatable e getmetatableIl metametodo __indexIl metametodo __newindexIl metametodo __tostringMetametodi aritmetici - Parte 1Metametodi aritmetici - Parte 2Riepilogo - Tabella di sola lettura2Altre funzioni della libreria table
table.concat()Costruzione di tabelle e unpack()table.sort()Ordinamento personalizzato con funzioniRiepilogo - Tabellone dei punteggi più altiEsercitati da solo: Compilatore Lua online