Menu
Coddy logo textTech

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 spéciale __sub définit le comportement de l’opérateur -. Le modèle est identique. Vous définissez 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 centrale de la métaméthode 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

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

challenge icon

Défi

Facile

Construisons 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 correspond à la différence des composantes.

Vous organiserez votre code dans deux fichiers :

  • Color.lua : définissez votre classe Color avec les composantes r, g et b représentant les valeurs rouge, verte et bleue. Incluez un constructeur :new(r, g, b) et implémentez la métaméthode __sub afin que la soustraction de deux couleurs crée une nouvelle couleur avec les différences composante par composante. N’oubliez pas que __sub utilise la syntaxe avec point et reçoit les deux opérandes comme arguments.
  • main.lua : exigez votre module Color, créez des instances de couleur à partir des entrées fournies, soustrayez-les et affichez les valeurs RGB obtenues.

Vous recevrez six entrées :

  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 votre fichier principal, créez deux couleurs avec les valeurs RGB données, soustrayez la deuxième couleur de la première à l’aide de l’opérateur -, puis affichez les valeurs r, g et b de la couleur obtenue sur des lignes distinctes.

Par exemple, si les entrées sont 200, 150, 100, 50, 30, 20, la sortie doit ê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

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

-- Lit 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 seconde couleur de la première en utilisant l'opérateur -

-- TODO: Afficher les valeurs r, g et b de la couleur résultante sur des lignes séparées
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