Pour chaque opérateur arithmétique, il existe une clé correspondante.
__add | addition |
__sub | soustraction |
__mul | multiplication |
__div | division |
__pow | exponentiel |
__unm | négation |
En règle générale, lorsque vous additionnez deux tables, vous ne vous posez aucune question, sur la métatable à utiliser et encore moins sur la métaméthode.
Il vous appartient, de prévoir un message d'erreur dans la langue que vous souhaitez utiliser, sinon c'est le message d'erreur du système, bien évidement en anglais, qui se déclenchera en cas de problème.
Et pour illustrer tout ça, rien ne vaut un petit exemple d'addition de 2 tables.
Pour ce faire, vous allez reprendre l'exemple de bananes ( et oui, j'adore les bananes... ) de tout à l'heure, mais en un peu plus complet.
Soit deux hangars où sont stockés des fruits.
Pour faire le bilan de l'entreprise, vous allez devoir additionner tous les stocks de marchandises communes.
-- Construction des tables nécessaires. local total = {} local hangar1 = {} local hangar2 = {} local mt = {} -- Construction de la table qui servira de métatable. mt.__add = function(a, b) -- Création de l'opération d'addition ( __add ) for k1, v1 in pairs(hangar1) do for k2, v2 in pairs(hangar2) do if k1 == k2 then total[k1] = v1 + v2 break end end end end setmetatable(hangar1, mt) -- Association de la mt à hangar1. local function addition(a, b) -- On ajoute un message d'erreur...au cas ou! if (getmetatable(a) == nil) and (getmetatable(b) == nil) then error( "Vous essayez d'additionner 2 tables sans métatable." ) else local t = a + b end end -- Les inventaires ont donné le résultat suivant: hangar1.banane = 12 hangar2.banane = 31 hangar1.orange = 15 hangar2.orange = 22 hangar1.pomme = 11 hangar2.pomme = 35 addition(hangar1, hangar2) -- On lance l'addition. -- Et on affiche le résultat. local liste = "" for k, v in pairs(total) do liste = k.." = "..v.."\n"..liste end print(liste) Ce qui donne: banane = 43 orange = 37 pomme = 46
La construction pour les autres méthodes mathématiques est similaire à celle que vous venez de voir.
Il suffit de remplacer le signe (+) par le signe de l'opération que vous souhaitez effectuer.
__sub, __unm, __mul, __div, __mod, __pow et __len.
Faites attention à ne pas confondre l'opérateur de soustraction (-) et l'opérateur de changement de signe d'un nombre.