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)
endNota 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 6L'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.
Sfida
FacileCreiamo 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 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. Ricorda che__addusa 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:
- Componente x del primo vettore
- Componente y del primo vettore
- Componente x del secondo vettore
- 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
6Il 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
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