Metametodi aritmetici - Parte 1
Fa parte della sezione Logica e flusso del percorso Lua di Coddy. Lezione 21 di 54.
Hai imparato a personalizzare ciò che accade quando stampi una tabella usando __tostring. Ora scoprirai che le metatabelle possono anche definire ciò che accade quando usi operatori aritmetici come + e - sulle tue tabelle.
Normalmente, se provi ad aggiungere due tabelle usando l’operatore +, Lua ti darà un errore perché non sa come sommare le tabelle. Ma con i metametodi aritmetici puoi definire esattamente cosa significa l’addizione per i tuoi tipi di dati personalizzati.
Il metametodo __add controlla il comportamento dell'addizione. Quando Lua incontra l'operatore + tra due valori e almeno uno ha una metatabella con __add, chiama quella funzione invece di generare un errore:
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) -- Risultato: 4 6La funzione __add riceve due argomenti: l'operando sinistro e l'operando destro. In questo esempio, crea una nuova tabella con valori x e y che sono la somma dei valori corrispondenti di entrambe le tabelle di input.
Allo stesso modo, il metametodo __sub controlla la sottrazione con l'operatore -:
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) -- Risultato: 2 2Questa possibilità di definire il comportamento personalizzato degli operatori si chiama sovraccarico degli operatori.
Sfida
FacileScrivi una funzione addVectors che prende x1, y1, x2 e y2 e restituisce il risultato della somma di due vettori.
Crea due tabelle vettore con le coordinate date, associa una metatabella con il metametodo __add per abilitare l'addizione dei vettori, sommali usando l'operatore + e restituisci il risultato come stringa formattata.
Logica:
- Crea la prima tabella vettore con le chiavi
x = x1ey = y1 - Crea la seconda tabella vettore con le chiavi
x = x2ey = y2 - Crea una metatabella con
__addche prende due vettori e restituisce una nuova tabella conx = a.x + b.xey = a.y + b.y - Associa la metatabella a entrambe le tabelle vettore usando
setmetatable() - Somma i due vettori usando
v1 + v2 - Restituisci il risultato come stringa nel formato
"x y"(i valori x e y separati da uno spazio)
Parametri:
x1(numero): La coordinata x del primo vettorey1(numero): La coordinata y del primo vettorex2(numero): La coordinata x del secondo vettorey2(numero): La coordinata y del secondo vettore
Restituisce: La somma dei due vettori come stringa nel formato "x y" (stringa)
Provalo tu
function addVectors(x1, y1, x2, y2)
-- Write code here
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