Menu
CoddyTech

Soustraire des objets

Fait partie de la section Programmation orientée objet du Journey Lua de Coddy. Leçon 27 sur 70.

Tout comme __add gère l’opérateur +, la méthode méta __sub définit le comportement de l’opérateur -. Le modèle est identique. Tu définis une fonction qui reçoit deux opérandes et renvoie un nouvel objet.

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

Lorsque vous travaillez avec des couleurs RGB, la soustraction peut produire des valeurs négatives. Dans les applications réelles, vous pouvez vouloir limiter les résultats à des plages valides (0-255), mais la structure fondamentale de la méthode métamodale reste la même.

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)  -- Sortie : 150  120  80

N’oublie pas : définis __sub avec un point (et non avec deux-points), car il s’agit d’une métaméthode que Lua appelle directement avec les deux opérandes comme arguments.

challenge icon

Défi

Facile

Créons une classe Color qui prend en charge la soustraction à l’aide de l’opérateur -. Les couleurs sont représentées par des valeurs RGB, et soustraire une couleur d’une autre crée une nouvelle couleur dont chaque composante est la différence des composantes correspondantes.

Tu vas répartir ton code dans deux fichiers :

  • Color.lua : définis ta classe Color avec les composantes r, g et b, qui représentent les valeurs du rouge, du vert et du bleu. Ajoute un constructeur :new(r, g, b) et implémente la métaméthode __sub afin que soustraire deux couleurs crée une nouvelle couleur dont les composantes sont les différences correspondantes. N’oublie pas que __sub utilise la syntaxe avec un point et reçoit les deux opérandes en arguments.
  • main.lua : charge ton module Color, crée des instances de couleur à partir des valeurs fournies, soustrais-les et affiche les valeurs RGB obtenues.

Tu recevras six valeurs en entrée :

  1. Composante rouge de la première couleur
  2. Composante verte de la première couleur
  3. Composante bleue de la première couleur
  4. Composante rouge de la deuxième couleur
  5. Composante verte de la deuxième couleur
  6. Composante bleue de la deuxième couleur

Dans ton fichier principal, crée deux couleurs avec les valeurs RGB données, soustrais la deuxième couleur de la première à l’aide de l’opérateur -, puis affiche les valeurs r, g et b de la couleur obtenue, chacune sur une ligne distincte.

Par exemple, si les valeurs d’entrée sont 200, 150, 100, 50, 30, 20, la sortie devrait être :

150
120
80

La première couleur (200, 150, 100) moins la deuxième couleur (50, 30, 20) donne une nouvelle couleur (150, 120, 80).

Essayez vous-même

-- Charger le module Color
local Color = require('Color')

-- Lire les valeurs d’entrée
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: Créer deux instances de Color avec les valeurs RGB données

-- TODO: Soustraire la deuxième couleur de la première à l’aide de l’opérateur -

-- TODO: Afficher les valeurs r, g et b de la couleur obtenue sur des lignes distinctes
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Compilateur Lua en ligne