Menu
CoddyTech

Sommare oggetti

Fa parte della sezione Programmazione orientata agli oggetti del percorso Lua di Coddy. Lezione 26 di 70.

Hai già visto come i metametodi come __tostring e __eq ti permettano di personalizzare il comportamento degli oggetti. Ora estenderemo questo concetto alle operazioni aritmetiche, iniziando con l'addizione.

Il metametodo __add definisce cosa accade quando usi l'operatore + tra due oggetti. Quando Lua vede a + b, cerca __add nella metatabella di uno dei due operandi.

local Vector = {}
Vector.__index = Vector

function Vector:new(x, y)
    local obj = {x = x, y = y}
    setmetatable(obj, Vector)
    return obj
end

function Vector.__add(v1, v2)
    return Vector:new(v1.x + v2.x, v1.y + v2.y)
end

Nota che __add è definito con un punto. Lua passa entrambi gli operandi come argomenti semplici e la forma con il punto li nomina entrambi. Funzionerebbe anche il due punti, perché function Vector:__add(other) equivale a function Vector.__add(self, other), ma la forma con il punto è quella convenzionale. __add dovrebbe restituire un nuovo oggetto invece di modificare uno dei due oggetti originali. Questo rende l'operazione prevedibile e sicura.

local a = Vector:new(3, 4)
local b = Vector:new(1, 2)
local c = a + b

print(c.x, c.y)  -- Output: 4  6

L'intuizione fondamentale è che __add deve trovarsi nella metatabella stessa (qui, Vector), non solo nell'oggetto. Poiché impostiamo Vector come metatabella per tutte le istanze, condividono automaticamente questo comportamento.

challenge icon

Sfida

Facile

Costruiamo una classe Vector che supporti l’addizione tramite l’operatore +. Questo è il tuo primo passo nell’overloading degli operatori: permetterai ai tuoi oggetti di interagire in modo naturale con gli operatori integrati di Lua.

Organizzerai il codice in due file:

  • Vector.lua: definisci la classe Vector con i componenti x e y. Includi un costruttore :new(x, y) e implementa il metametodo __add in modo che l’addizione di due vettori crei un nuovo vettore con i componenti sommati. Definisci __add con la sintassi a punto, così entrambi gli operandi vengono passati come argomenti con nome.
  • main.lua: carica il modulo Vector, crea istanze di vettori e dimostra che sommandoli si ottiene il risultato corretto.

Riceverai quattro valori in input:

  1. Componente x del primo vettore
  2. Componente y del primo vettore
  3. Componente x del secondo vettore
  4. Componente y del secondo vettore

Nel file principale, crea due vettori con i componenti specificati, sommali usando l’operatore + e stampa i valori x e y del vettore risultante su righe separate.

Per esempio, se i valori in input sono 3, 4, 1, 2, l’output dovrebbe essere:

4
6

Il primo vettore (3, 4) più il secondo vettore (1, 2) è uguale a un nuovo vettore (4, 6).

Provalo tu

-- Carica il modulo Vector
local Vector = require('Vector')

-- Leggi l'input
local x1 = tonumber(io.read())
local y1 = tonumber(io.read())
local x2 = tonumber(io.read())
local y2 = tonumber(io.read())

-- TODO: crea due istanze di Vector usando i valori di input

-- TODO: somma i due vettori usando l'operatore +

-- TODO: stampa i valori x e y del vettore risultante su righe separate
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 Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Lua online