Les tables en Lua ont habituellement un ensemble d'opérations assez prévisible.
Vous pouvez ajouter des paires clé-valeur, vous pouvez vérifier la valeur associée à une clé, vous pouvez traverser toutes les paires clé-valeur, et vous pouvez... Oups!, mais, c'est tout.
Vous ne pouvez pas, par exemple additionner des tables, comparer les tables entre elles, ou appeler une table.
C'est là que les métatables et leurs métaméthodes interviennent.
Car si la table t1 est mise en jeu dans une opération qu'elle ne sait pas faire, alors sa métatable mt lui indiquera la marche à suivre.
Une métatable contrôle comment un objet se comporte dans les opérations arithmétiques, dans les comparaisons, la concaténation, les opérations "length", et d'indexation.
Chaque opération est identifiée par son nom correspondant.
La clé, pour chaque opération est une chaîne avec son nom précédé de deux caractères de soulignement, __xyz
Par exemple, la clé de l'opération "addition", est la chaîne "__add".
Les métatables vont vous permettre de changer le comportement initial d'une table.
Par exemple, en utilisant les métatables, vous pourrez définir comment Lua calculera l'expression a + b, si a et b sont des tables...
Quand Lua essaye d'ajouter deux tables, il vérifie si l'une d'elle a une métatable et si cette métatable possède un champ __add.
Si Lua trouve ce champ, alors il appelle la valeur correspondante pour calculer la somme.