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 6La 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 2Cette capacité à définir le comportement d'opérateurs personnalisés est appelée surcharge d'opérateur.
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 = x1ety = y1 - Créez la deuxième table de vecteur avec les clés
x = x2ety = y2 - Créez une métatable avec
__addqui prend deux vecteurs et retourne une nouvelle table avecx = a.x + b.xety = 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 vecteury1(nombre) : La coordonnée y du premier vecteurx2(nombre) : La coordonnée x du second vecteury2(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 6La 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 2Essayez vous-même
function addVectors(x1, y1, x2, y2)
-- Écrire le code ici
end
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
1Itération avancée des tables
Itérer avec pairs()Itérer avec ipairs()pairs() vs. ipairs()Récapitulatif - Fiche de personnage4Introduction aux Metatables
Qu'est-ce qu'une Metatable ?setmetatable & getmetatableLa métaméthode __indexLa métaméthode __newindexLa métaméthode __tostringMétaméthodes arithmétiques - Partie 1Métaméthodes arithmétiques - Partie 2Récapitulatif - Table en lecture seule2Plus de fonctions de la bibliothèque table
table.concat()Construction de table & unpack()table.sort()Tri personnalisé avec des fonctionsRécapitulatif - Tableau des scores3Concepts avancés sur les fonctions
Retourner plusieurs valeursFonctions variadiques (...)Les fonctions comme valeurs de première classeFonctions anonymesQu'est-ce qu'une closure ?Récapitulatif - Gestionnaire d'événements simple