Lua: Le tutoriel  wxWidgets
Lua
Les métatables: Les métaméthodes arithmétiques.

Pour chaque opérateur arithmétique, il existe une clé correspondante.

__addaddition
__subsoustraction
__mulmultiplication
__divdivision
__powexponentiel
__unmné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.

Pour sélectionner la métaméthode adéquate, LUA va effectuer les opérations suivantes:
  1. Si la première valeur dispose d'une métatable avec un champ __add, LUA utilisera cette valeur comme étant LA métaméthode à utiliser.
    Sinon
  2. Si la deuxième valeur dispose d'une métatable avec un champ __add, LUA utilisera cette deuxième valeur comme étant LA métaméthode à utiliser.
    Sinon
  3. LUA déclenchera un message d'erreur.

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.

logo wxWidgets Le savoir ne vaut que s'il est partagé par tous...
logo-internet_32x32.png Dernière mise à jour, le 5 décembre 2012.
Valid XHTML 1.0 Transitional

wxlualogo
Flèche haut
Flèche gauche
Flèche haut
Flèche droite