Lua: Le tutoriel  wxWidgets
Lua
Les métatables: Et concrètement, on fait comment?.

Je vais essayer de faire simple:
Supposez que vous ayez 2 tables distinctes, t1 et t2 dans lesquelles sont stockées des quantités d'articles. ( par exemples, des bananes!.. et pourquoi pas des bananes?)
t1 = {25} et t2 = {18}
Ce sont les mêmes articles et vous voulez les additionner.
Si vous faites, t1 + t2 ... cela générera une erreur.
Donc, pour additionner le contenu de ces 2 tables, vous allez:
1- Construire une métatable.
2- Définir les conditions d’addition pour t1 et t2
3- Associer cette métatable à une des 2 tables t1 ou t2.

	-- Les tables t1 et t2			
	t1 = {25}
	t2 = {18}
	
	mt = {}	-- Construction de la table qui servira de métatable.
	
	-- Définition de l'opération addition.
	mt.__add = function(a, b)
			return{valeur = a[1] + b[1]}
		end
	
	setmetatable(t1, mt)	-- Association de mt à t1.

	Et maintenant si l'on fait:
		print(unpack(t1 + t2))
	. . .Cela donnera: 43
				

Pourquoi print( unpack( t1 + t2 ) )?
Parce que vous ne pouvez pas faire directement print(table), car si vous faites: print(t1 + t2), vous n'obtiendrez pas son contenu, mais le type et son emplacement mémoire. --> table:01092738
Il convient donc d'utiliser la fonction table.unpack(), qui retourne les éléments de la table donnée et qui bien sur peut s'écrire unpack(table).

__add, nom de la fonction est aussi appelé clé de la métatable ou encore évènement.
Dans l'exemple précédent l'évènement est "add" et la métaméthode est la fonction qui effectue l'addition.

On ne peut pas utiliser n'importe quoi comme clé.

Un petit rappel: mt.__add = function(a, b) est équivalent à: function mt.__add(a, b).

Il existe 18 clés déja définies dans le noyau de Lua.

clé( arguments ) explication.
__add( t1, t2 )l'opération +.
__sub( t1, t2 )l'opération -. Comportement similaire à l'opération __add.
__mul( t1, t2 )l'opération *. Comportement similaire à l'opération __add.
__div( t1, t2 )l'opération /. Comportement similaire à l'opération __add.
__mod( t1, t2 )l'opération %. Comportement similaire à l'opération __add, avec l'opération o1 - floor(o1/o2)*o2 en tant qu'opération primitive.
__pow( t1, t2 )l'opération ^ (exponentielle). Comportement similaire à l'opération __add, avec la fonction pow (depuis la librairie math du C) en tant qu'opération primitive.
__unm( objet )l'opération unaire -. Désigne une valeur négative.
__concat( t1, t2 )l'opération de concaténation ( .. ).
__len( object )l'opération #. La fonction ne reçoit que la variable
__eq( t1, t2 )l'opération ==. Ne sera utilisé que si les deux valeurs comparées sont du même type
__lt( t1, t2 )l'opération <.a > b est équivalent à b < a..
__le( t1, t2 )l'opération <=.a >= b est équivalent à b <= a. Sachez que, s'il n'y a pas de "le" métaméthode, Lua va essayer d'utiliser "lt", en prenant en compte que a <= b équivaut à not (b < a)
__index( objet, clé ) utilisée lorsqu'on tente d'accéder à un élément de la variable inexistant. Sera exploité pour la création d'une classe dans la partie POO. La fonction reçoit la variable et la clé demandée.
__newindex( obj, clé, val ) utilisée lorsqu'on tente de modifier ou de créer un élément de la variable. La fonction reçoit la variable, la clé et la valeur.
__call( objet, ... ) utilisée lorsque la variable est appelée comme une fonction. La fonction reçoit la variable, et tous les arguments de l'appel dans l'ordre où ceux-ci ont été passés.
__metatable( objet ) utilisée pour rendre inaccessible la metatable : donnez-lui la valeur que vous voulez, et c'est cette valeur qui sera retournée par getmetatable(), à la place la metatable.
__tostring(objet) liée à la fonction d'affichage print().Permet d'afficher le contenu d'une table en utilisant print()
__modeCette métaméthode permet de définir le niveau de "faiblesse" de la référence vers une table. Aptitude qu'aura une table à être prise en compte ou non par le ramasse-miette...


1 - Construire la métatable mt = {}
2 - Définir son action mt.__xyz = function() . . . return . . . end
3 - L'associer à une table setmetatable(table, mt)
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