Menu
Coddy logo textTech

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  6

La 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  2

Questa possibilità di definire il comportamento personalizzato degli operatori si chiama sovraccarico degli operatori.

challenge icon

Sfida

Facile

Scrivi 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 = x1 e y = y1
  • Crea la seconda tabella vettore con le chiavi x = x2 e y = y2
  • Crea una metatabella con __add che prende due vettori e restituisce una nuova tabella con x = a.x + b.x e y = 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 vettore
  • y1 (numero): La coordinata y del primo vettore
  • x2 (numero): La coordinata x del secondo vettore
  • y2 (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
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Lua online