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)
endNota 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 6L'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.
Sfida
FacileCostruiamo 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 componentixey. Includi un costruttore:new(x, y)e implementa il metametodo__addin modo che l’addizione di due vettori crei un nuovo vettore con i componenti sommati. Definisci__addcon 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:
- Componente x del primo vettore
- Componente y del primo vettore
- Componente x del secondo vettore
- 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
6Il 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
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
1Il concetto di «self»
Tabelle con funzioni«self» esplicitoLa sintassi dei due puntiPunto o due puntiRiepilogo - Spostare il punto4Progetto: Banca digitale
Configurazione del progettoMetodo di deposito2Schema del prototipo di classe
Il concetto di prototipoCollegare con __indexIl costruttore :new()Inizializzare gli attributiIstanze indipendentiRiepilogo - Fabbrica di auto5Sovraccarico degli operatori nella OOP
Sommare oggettiSottrarre oggettiConcatenare oggettiConfrontare oggetti (<, >)Ripasso - Calcoli con il portafoglio8Incapsulamento
Convenzioni di denominazioneClosure per la privacyAccesso tramite closureTabelle di sola letturaLogica di convalidaRiepilogo - Cassaforte sicura11Modelli di progettazione (base)
Funzioni factoryTabella singletonPattern IteratorObserver (listener)Riepilogo - Factory per logger3Stato e comportamento degli oggetti
Variabili di istanzaMetodi getterMetodi setterProprietà calcolateFormattazione delle stringheControlli di uguaglianzaRiepilogo - Voto dello studente6Fondamenti dell'ereditarietà
Configurare l'ereditarietàEreditare i metodiEstendere il costruttoreAggiungere metodi alla classe figliaCondiviso vs specificoRiepilogo - Gerarchia delle formeEsercitati da solo: Compilatore Lua online