Menu
Coddy logo textTech

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  8

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

Questi 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.

challenge icon

Sfida

Facile

Scrivi 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 x e y impostate sulle coordinate fornite
  • Crea una metatabella con __mul che gestisce la moltiplicazione tra un vettore e uno scalare
  • La funzione __mul dovrebbe controllare quale operando è il numero e quale è la tabella
  • Restituisci una nuova tabella con x = vec.x * scalar e y = 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 vettore
  • y (numero): La coordinata y del vettore
  • scalar (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
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