Ce qui permet de concaténer 2 tables: table0 = table1..table2
mt.__concat = function(a,b) local t = a for k in ipairs(b) do table.insert(t,b[k]) end return t end
mt.__tostring = function(b) local s = "" for k in ipairs(b) do s = s.." "..b[k] end return s end
mt.__call = function(objet) ... ici nouvelles informations concernant la table.. end
mt.__metatable = "ici le message.."
La métaméthode __index peut être une table ou une fonction.
1- Si c'est une table, le champ absent sera recherché dans cette table.
table_type = {x = 100, y = 150} -- Construction d'une table 'type'. table = {} -- Construction de la table. mt = {} -- Construction de la métatable. mt._index(table_type) -- Construction de __index. setmetatable(table, mt) -- Association table et mt print(table.x, table.y) --> 100, 150
2- Si c'est une fonction, __index peut prendre 0, 1 ou 2 arguments, dans ce cas, ces arguments sont respectivement la table appelante et le champ recherché. __index(), __index(table) ou __index(table, champ)
-- Sans argument. mt.__index = function() return 100 end -- Avec 1 argument. mt.__index = function(k) return k end -- Avec 2 arguments. mt.__index = function(k, v) return v end
Elle peut par exemple, empêcher de rajouter un nouveau champ.
-- Soit la table suivante. table = {a = 10, b = 20, c = 30} -- Mise en place, maintenant classique. mt = {} mt.__newindex = function(t, k, v) end setmetatable(table, mt) -- Et maintenant. table.z = 150 print(table.z) ==> ce qui donnera: nil
Le niveau de "faiblesse", est l'aptitude qu'aura une table à être prise en compte ou non par le ramasse-miettes (garbagecollector).
La faiblesse d'une table est contrôlée par le champ de sa métaméthode: __mode.
Si le champ __mode est une chaîne contenant le caractère "k", alors les clés de la table seront considérées comme faibles.
Si le champ __mode contient la lettre "v", alors ce sera les valeurs de la table qui seront considérées comme faibles.