Menu
Coddy logo textTech

Métaméthodes arithmétiques - Partie 1

Fait partie de la section Logic & Flow du Journey Lua de Coddy — leçon 21 sur 54.

Vous avez appris comment personnaliser ce qui se passe lorsque vous affichez une table en utilisant __tostring. Maintenant, vous allez découvrir que les métatables peuvent également définir ce qui se passe lorsque vous utilisez des opérateurs arithmétiques comme + et - sur vos tables.

Normalement, si vous essayez d'additionner deux tables ensemble avec l'opérateur +, Lua vous donnera une erreur parce qu'il ne sait pas comment additionner des tables. Mais avec les métaméthodes arithmétiques, vous pouvez définir exactement ce que l'addition signifie pour vos types de données personnalisés.

La métaméthode __add contrôle le comportement de l'addition. Lorsque Lua rencontre l'opérateur + entre deux valeurs et qu'au moins l'une d'elles possède une métatable avec __add, il appelle cette fonction au lieu de produire une erreur :

local v1 = {x = 3, y = 4}
local v2 = {x = 1, y = 2}

local meta = {
    __add = function(a, b)
        return {x = a.x + b.x, y = a.y + b.y}
    end
}

setmetatable(v1, meta)
setmetatable(v2, meta)

local v3 = v1 + v2
print(v3.x, v3.y)  -- Output: 4  6

La fonction __add reçoit deux arguments : l'opérande de gauche et l'opérande de droite. Dans cet exemple, elle crée une nouvelle table avec des valeurs x et y qui sont la somme des valeurs correspondantes des deux tables d'entrée.

De même, la métaméthode __sub contrôle la soustraction avec l'opérateur - :

local meta = {
    __sub = function(a, b)
        return {x = a.x - b.x, y = a.y - b.y}
    end
}

setmetatable(v1, meta)
setmetatable(v2, meta)

local v3 = v1 - v2
print(v3.x, v3.y)  -- Sortie : 2  2

Cette capacité à définir le comportement d'opérateurs personnalisés est appelée surcharge d'opérateur.

challenge icon

Défi

Facile

Écrivez une fonction addVectors qui prend x1, y1, x2 et y2 et retourne le résultat de l'addition de deux vecteurs.

Créez deux tables de vecteurs avec les coordonnées données, attachez une métatable avec la métaméthode __add pour permettre l'addition de vecteurs, additionnez-les en utilisant l'opérateur +, et retournez le résultat sous forme de chaîne formatée.

Logique :

  • Créez la première table de vecteur avec les clés x = x1 et y = y1
  • Créez la deuxième table de vecteur avec les clés x = x2 et y = y2
  • Créez une métatable avec __add qui prend deux vecteurs et retourne une nouvelle table avec x = a.x + b.x et y = a.y + b.y
  • Attachez la métatable aux deux tables de vecteurs en utilisant setmetatable()
  • Additionnez les deux vecteurs en utilisant v1 + v2
  • Retournez le résultat sous forme de chaîne au format "x y" (les valeurs x et y séparées par un espace)

Paramètres :

  • x1 (nombre) : La coordonnée x du premier vecteur
  • y1 (nombre) : La coordonnée y du premier vecteur
  • x2 (nombre) : La coordonnée x du second vecteur
  • y2 (nombre) : La coordonnée y du second vecteur

Retourne : La somme des deux vecteurs sous forme de chaîne au format "x y" (string)

Aide-mémoire

Les métatables peuvent définir ce qui se passe lorsque vous utilisez des opérateurs arithmétiques comme + et - sur des tables. C'est ce qu'on appelle la surcharge d'opérateurs.

La métaméthode __add contrôle le comportement de l'addition avec l'opérateur + :

local v1 = {x = 3, y = 4}
local v2 = {x = 1, y = 2}

local meta = {
    __add = function(a, b)
        return {x = a.x + b.x, y = a.y + b.y}
    end
}

setmetatable(v1, meta)
setmetatable(v2, meta)

local v3 = v1 + v2
print(v3.x, v3.y)  -- Output: 4  6

La fonction __add reçoit deux arguments : l'opérande de gauche et l'opérande de droite.

La métaméthode __sub contrôle la soustraction avec l'opérateur - :

local meta = {
    __sub = function(a, b)
        return {x = a.x - b.x, y = a.y - b.y}
    end
}

setmetatable(v1, meta)
setmetatable(v2, meta)

local v3 = v1 - v2
print(v3.x, v3.y)  -- Output: 2  2

Essayez vous-même

function addVectors(x1, y1, x2, y2)
    -- Écrire le code ici
end
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 Logic & Flow