Menu
Coddy logo textTech

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 permettono di personalizzare il comportamento degli oggetti. Ora estenderemo questo concetto alle operazioni aritmetiche, iniziando con l'addizione.

Il metametodo __add definisce cosa succede quando usi l'operatore + tra due oggetti. Quando Lua incontra 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, non con i due punti. Riceve entrambi gli operandi come argomenti e dovrebbe restituire un nuovo oggetto anziché modificare uno dei due 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)  -- Risultato: 4  6

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

challenge icon

Sfida

Facile

Creiamo una classe Vector che supporti l'addizione usando l'operatore +. Questo è il tuo primo passo nell'overloading degli operatori, che permette ai tuoi oggetti di funzionare in modo naturale con gli operatori integrati di Lua.

Organizzerai il codice in due file:

  • Vector.lua: definisci la tua 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. Ricorda che __add usa la sintassi con il punto (non i due punti) e riceve entrambi gli operandi come argomenti.
  • main.lua: carica il modulo Vector, crea istanze di vettore e mostra che la loro somma produce 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 tuo file principale, crea due vettori con i componenti forniti, sommali usando l'operatore + e stampa i valori x e y del vettore risultante su righe separate.

Ad esempio, se gli 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

-- Importa 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