Menu
Coddy logo textTech

Additionner des objets

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

Vous avez déjà vu comment des métaméthodes comme __tostring et __eq vous permettent de personnaliser le comportement des objets. Nous allons maintenant é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 rencontre a + b, il recherche __add dans la métatable de l’un ou l’autre opérande.

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

Remarquez que __add est défini avec un point, et non avec deux-points. Il reçoit les deux opérandes comme arguments et doit renvoyer un nouvel objet plutôt que de modifier l’un ou l’autre objet d’origine. Cela rend 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)  -- Sortie : 4  6

L’idée essentielle est que __add doit se trouver dans la metatable elle-même (ici, Vector), et pas seulement dans l’objet. Puisque nous définissons Vector comme la metatable de toutes les instances, elles partagent toutes automatiquement ce comportement.

challenge icon

Défi

Facile

Construisons une classe Vector qui prend en charge l’addition à l’aide de l’opérateur +. Il s’agit de votre première étape vers la surcharge des opérateurs, qui permet à vos objets de fonctionner 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 les composants x et y. Incluez un constructeur :new(x, y) et implémentez la méthode métaméthode __add afin que l’addition de deux vecteurs crée un nouveau vecteur avec les composants combinés. N’oubliez pas que __add utilise la syntaxe avec un point (et non avec deux-points) et reçoit les deux opérandes comme arguments.
  • main.lua : importez votre module Vector, créez des instances de vecteur et montrez que leur addition produit le résultat correct.

Vous recevrez quatre valeurs en entrée :

  1. La composante x du premier vecteur
  2. La composante y du premier vecteur
  3. La composante x du deuxième vecteur
  4. La composante y du deuxième vecteur

Dans votre fichier principal, créez deux vecteurs avec les composantes données, 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 valeurs d’entrée sont 3, 4, 1, 2, la sortie doit être :

4
6

Le premier vecteur (3, 4) plus le deuxième vecteur (1, 2) donne un nouveau vecteur (4, 6).

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: Ajouter 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
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