Soustraire des objets
Fait partie de la section Object Oriented Programming du Journey Lua de Coddy — leçon 27 sur 70.
Tout comme __add gère l'opérateur +, la métaméthode __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)
endLorsque vous travaillez avec des couleurs RVB, la soustraction peut produire des valeurs négatives. Dans les applications réelles, vous pourriez vouloir limiter les résultats à des plages valides (0-255), mais la structure fondamentale 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) -- Résultat : 150 120 80Rappelez-vous : définissez __sub avec un point (et non deux-points) car c'est une métaméthode que Lua appelle directement avec les deux opérandes comme arguments.
Défi
FacileConstruisons 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 avec la différence de chaque composante.
Vous organiserez votre code sur deux fichiers :
Color.lua: Définissez votre classe Color avec les composantesr,getbreprésentant les valeurs rouge, vert et bleu. Incluez un constructeur:new(r, g, b)et implémentez la métaméthode__subafin que la soustraction de deux couleurs crée une nouvelle couleur avec les différences par composante. N'oubliez pas que__subutilise la syntaxe avec point et reçoit les deux opérandes comme arguments.main.lua: Importez votre module Color, créez des instances de couleur à partir des entrées fournies, soustrayez-les et affichez les valeurs RGB résultantes.
Vous recevrez six entrées :
- Composante rouge de la première couleur
- Composante verte de la première couleur
- Composante bleue de la première couleur
- Composante rouge de la deuxième couleur
- Composante verte de la deuxième couleur
- 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 -, et affichez les valeurs r, g et b de la couleur résultante sur des lignes séparées.
Par exemple, si les entrées sont 200, 150, 100, 50, 30, 20, la sortie devrait être :
150
120
80La première couleur (200, 150, 100) moins la deuxième couleur (50, 30, 20) est égale à une nouvelle couleur (150, 120, 80).
Aide-mémoire
La métaméthode __sub définit le comportement de l'opérateur -. Elle reçoit deux opérandes et renvoie un nouvel objet.
function Color.__sub(c1, c2)
return Color:new(c1.r - c2.r, c1.g - c2.g, c1.b - c2.b)
endDéfinissez __sub avec un point (pas deux-points) car c'est une métaméthode que Lua appelle directement avec les deux opérandes comme arguments.
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 80Essayez 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 RVB données
-- TODO : Soustraire la deuxième 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
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Object Oriented Programming
1Le concept de « self »
Tables avec fonctions« self » expliciteLa syntaxe avec deux-pointsPoint vs deux-pointsRécapitulatif - Point mobile4Projet : Banque numérique
Configuration du projetMéthode de dépôt7Polymorphisme et Redéfinition
Redéfinition de méthodesAppeler des méthodes parentesDuck TypingInterface communeVérification du typeRécapitulatif - Rôles des employés10Projet : Gestionnaire de formes
Configuration du projetClasse Rectangle2Modèle de prototype de classe
Le concept de prototypeLiaison avec __indexLe constructeur :new()Initialisation des attributsInstances indépendantesRécapitulatif - Usine de voitures5Surcharge d'opérateurs en POO
Additionner des objetsSoustraire des objetsConcaténer des objetsComparer des objets (<, >)Récapitulatif - Calculs de portefeuille8Encapsulation
Conventions de nommageClosures pour la confidentialitéAccès via les ClosuresTables en lecture seuleLogique de validationRécapitulatif - Coffre-fort sécurisé11Patrons de conception (Lite)
Fonctions FactoryTable SingletonPatron IteratorObserver (Écouteur)Récapitulatif - Logger Factory3État et comportement des objets
Variables d'instanceMéthodes GetterMéthodes SetterPropriétés calculéesFormatage de chaînesVérifications d'égalitéRécapitulatif - Note de l'étudiant6Bases de l'héritage
Mise en place de l'héritageHériter des méthodesÉtendre le constructeurAjouter des méthodes enfantsPartagé vs UniqueRécapitulatif - Hiérarchie des formes