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)
endLorsque 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 80Souviens-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.
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 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 composantesr,getbreprésentant les valeurs rouge, verte et bleue. 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 composante par composante. N’oubliez pas que__subutilise 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 :
- 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 -, 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
80La 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
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
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 RectangleClasse CercleMéthode PérimètreCollection de formesAire totaleFiltrer les formes2Modè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 formesEntraînez-vous par vous-même : Compilateur Lua en ligne