Menu
Coddy logo textTech

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)
end

Quando 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  80

Ricorda: definisci __sub con un punto (non con i due punti), poiché è un metametodo che Lua chiama direttamente passando entrambi gli operandi come argomenti.

challenge icon

Sfida

Facile

Costruiamo 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 componenti r, g e b, che rappresentano i valori di rosso, verde e blu. Includi un costruttore :new(r, g, b) e implementa il metametodo __sub in modo che sottrarre due colori crei un nuovo colore con le differenze componente per componente. Ricorda che __sub usa 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:

  1. Componente rossa del primo colore
  2. Componente verde del primo colore
  3. Componente blu del primo colore
  4. Componente rossa del secondo colore
  5. Componente verde del secondo colore
  6. 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
80

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