Additionner des objets
Fait partie de la section Object Oriented Programming du Journey Lua de Coddy — leçon 26 sur 70.
Vous avez déjà vu comment les métaméthodes comme __tostring et __eq vous permettent de personnaliser le comportement des objets. Maintenant, nous allons étendre cela aux opérations arithmétiques, en commençant par l'addition.
La métaméthode __add définit ce qui se passe lorsque vous utilisez l'opérateur + entre deux objets. Lorsque Lua voit a + b, il cherche __add dans la métatable de l'un ou l'autre des opérandes.
local Vector = {}
Vector.__index = Vector
function Vector:new(x, y)
local obj = {x = x, y = y}
setmetatable(obj, Vector)
return obj
end
function Vector.__add(v1, v2)
return Vector:new(v1.x + v2.x, v1.y + v2.y)
endRemarquez que __add est défini avec un point, pas deux-points. Il reçoit les deux opérandes comme arguments et doit retourner un nouvel objet plutôt que de modifier l'un ou l'autre des originaux. Cela maintient l'opération prévisible et sûre.
local a = Vector:new(3, 4)
local b = Vector:new(1, 2)
local c = a + b
print(c.x, c.y) -- Résultat: 4 6L'idée clé est que __add doit se trouver dans la métatable elle-même (ici, Vector), et pas seulement dans l'objet. Puisque nous définissons Vector comme métatable pour toutes les instances, elles partagent toutes ce comportement automatiquement.
Défi
FacileConstruisons une classe Vector qui prend en charge l'addition à l'aide de l'opérateur +. C'est votre premier pas dans la surcharge d'opérateurs — faire en sorte que vos objets fonctionnent naturellement avec les opérateurs intégrés de Lua.
Vous organiserez votre code sur deux fichiers :
Vector.lua: Définissez votre classe Vector avec des composantsxety. Incluez un constructeur:new(x, y)et implémentez la métaméthode__addafin que l'addition de deux vecteurs crée un nouveau vecteur avec les composants combinés. Rappelez-vous que__addutilise la syntaxe avec un point (pas deux-points) et reçoit les deux opérandes comme arguments.main.lua: Importez votre module Vector, créez des instances de vecteur et démontrez que leur addition produit le résultat correct.
Vous recevrez quatre entrées :
- Le composant x du premier vecteur
- Le composant y du premier vecteur
- Le composant x du second vecteur
- Le composant y du second vecteur
Dans votre fichier principal, créez deux vecteurs avec les composants donnés, additionnez-les à l'aide de l'opérateur +, et affichez les valeurs x et y du vecteur résultant sur des lignes séparées.
Par exemple, si les entrées sont 3, 4, 1, 2, la sortie devrait être :
4
6Le premier vecteur (3, 4) plus le second vecteur (1, 2) est égal à un nouveau vecteur (4, 6).
Aide-mémoire
La métaméthode __add définit ce qui se passe lorsque vous utilisez l'opérateur + entre deux objets.
Lorsque Lua voit a + b, il cherche __add dans la métatable de l'un ou l'autre des opérandes.
local Vector = {}
Vector.__index = Vector
function Vector:new(x, y)
local obj = {x = x, y = y}
setmetatable(obj, Vector)
return obj
end
function Vector.__add(v1, v2)
return Vector:new(v1.x + v2.x, v1.y + v2.y)
end__add est définie avec un point, pas deux-points. Elle reçoit les deux opérandes comme arguments et doit retourner un nouvel objet plutôt que de modifier l'un ou l'autre des originaux.
local a = Vector:new(3, 4)
local b = Vector:new(1, 2)
local c = a + b
print(c.x, c.y) -- Résultat : 4 6__add doit se trouver dans la métatable elle-même, et pas seulement dans l'objet.
Essayez vous-même
-- Requiert le module Vector
local Vector = require('Vector')
-- Lire l'entrée
local x1 = tonumber(io.read())
local y1 = tonumber(io.read())
local x2 = tonumber(io.read())
local y2 = tonumber(io.read())
-- TODO: Créer deux instances de Vector en utilisant les valeurs d'entrée
-- TODO: Additionner les deux vecteurs en utilisant l'opérateur +
-- TODO: Afficher les valeurs x et y du vecteur résultant 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