Sottrarre oggetti
Fa parte della sezione Programmazione orientata agli oggetti del percorso Lua di Coddy. Lezione 27 di 70.
Proprio come __add gestisce l'operatore +, il metametodo __sub definisce il comportamento dell'operatore -. Lo schema è identico. Definisci una funzione che riceve due operandi e restituisce un nuovo oggetto.
local Color = {}
Color.__index = Color
function Color:new(r, g, b)
local obj = {r = r, g = g, b = b}
setmetatable(obj, Color)
return obj
end
function Color.__sub(c1, c2)
return Color:new(c1.r - c2.r, c1.g - c2.g, c1.b - c2.b)
endQuando lavori con i colori RGB, la sottrazione può produrre valori negativi. Nelle applicazioni reali, potresti voler limitare i risultati a intervalli validi (0-255), ma la struttura fondamentale del metametodo rimane la stessa.
local bright = Color:new(200, 150, 100)
local dim = Color:new(50, 30, 20)
local result = bright - dim
print(result.r, result.g, result.b) -- Risultato: 150 120 80Ricorda: definisci __sub con un punto (non con i due punti), poiché è un metametodo che Lua chiama direttamente passando entrambi gli operandi come argomenti.
Sfida
FacileCostruiamo una classe Color che supporti la sottrazione usando l'operatore -. I colori sono rappresentati da valori RGB e sottrarre un colore da un altro crea un nuovo colore con la differenza di ciascuna componente.
Organizzerai il codice in due file:
Color.lua: Definisci la classe Color con le componentir,geb, che rappresentano i valori di rosso, verde e blu. Includi un costruttore:new(r, g, b)e implementa il metametodo__subin modo che sottrarre due colori crei un nuovo colore con le differenze componente per componente. Ricorda che__subusa la sintassi con il punto e riceve entrambi gli operandi come argomenti.main.lua: Richiedi il modulo Color, crea istanze di colore dai valori di input forniti, sottrai i colori e visualizza i valori RGB risultanti.
Riceverai sei valori di input:
- Componente rossa del primo colore
- Componente verde del primo colore
- Componente blu del primo colore
- Componente rossa del secondo colore
- Componente verde del secondo colore
- Componente blu del secondo colore
Nel file principale, crea due colori con i valori RGB indicati, sottrai il secondo colore dal primo usando l'operatore - e stampa i valori r, g e b del colore risultante su righe separate.
Per esempio, se i valori di input sono 200, 150, 100, 50, 30, 20, l'output dovrebbe essere:
150
120
80Il primo colore (200, 150, 100) meno il secondo colore (50, 30, 20) dà un nuovo colore (150, 120, 80).
Provalo tu
-- Carica il modulo Color
local Color = require('Color')
-- Leggi i valori di input
local r1 = tonumber(io.read())
local g1 = tonumber(io.read())
local b1 = tonumber(io.read())
local r2 = tonumber(io.read())
local g2 = tonumber(io.read())
local b2 = tonumber(io.read())
-- TODO: Crea due istanze di Color con i valori RGB forniti
-- TODO: Sottrai il secondo colore dal primo usando l'operatore -
-- TODO: Stampa i valori r, g e b del colore 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