setmetatable & getmetatable
Fait partie de la section Logic & Flow du Journey Lua de Coddy — leçon 17 sur 54.
Maintenant que vous comprenez ce que sont les métatables d'un point de vue conceptuel, il est temps d'apprendre à les manipuler concrètement. Lua fournit deux fonctions essentielles pour cela : setmetatable() pour attacher une métatable à une table, et getmetatable() pour la récupérer.
Pour attacher une métatable à une table, vous utilisez setmetatable(). Cette fonction prend deux arguments : la table que vous souhaitez modifier (la table principale) et la métatable que vous souhaitez lui attacher :
local myTable = {name = "Alice"}
local myMetatable = {}
setmetatable(myTable, myMetatable)Dans cet exemple, myMetatable est maintenant attaché à myTable. La métatable elle-même est vide pour le moment, mais cela établit la connexion entre les deux tables. La fonction setmetatable() retourne également la table principale, ce qui vous permet de chaîner l'opération si nécessaire.
Pour récupérer la métatable attachée à une table, vous utilisez getmetatable() :
local retrievedMeta = getmetatable(myTable)
print(retrievedMeta == myMetatable) -- Sortie : trueCette fonction renvoie la métatable si une est attachée, ou nil si la table n'a pas de métatable. Ceci est utile lorsque vous devez vérifier ou modifier la métatable d'une table après qu'elle a été définie.
Comprendre ces deux fonctions est la base de tout travail sur les métatables en Lua. Une fois que vous saurez attacher et récupérer des métatables, vous serez prêt à définir des métaméthodes qui modifient le comportement de vos tables.
Défi
FacileÉcrivez une fonction attachMetatable qui prend mainTable et metaTable et retourne true si la métatable a été attachée avec succès.
Utilisez setmetatable() pour attacher la métatable à la table principale, puis vérifiez l'attachement en utilisant getmetatable().
Logique :
- Attachez
metaTableàmainTableen utilisantsetmetatable() - Récupérez la métatable attachée en utilisant
getmetatable() - Comparez la métatable récupérée avec la
metaTableoriginale - Retournez
truesi elles correspondent,falsesinon
Paramètres :
mainTable(table) : La table à laquelle la métatable sera attachéemetaTable(table) : La métatable à attacher
Retourne : true si la métatable a été attachée et vérifiée avec succès, false sinon (booléen)
Aide-mémoire
Lua fournit deux fonctions essentielles pour travailler avec les métatables :
setmetatable() - Attache une métatable à une table. Prend deux arguments : la table principale et la métatable à attacher. Retourne la table principale.
local myTable = {name = "Alice"}
local myMetatable = {}
setmetatable(myTable, myMetatable)getmetatable() - Récupère la métatable attachée à une table. Retourne la métatable si une est attachée, ou nil si la table n'a pas de métatable.
local retrievedMeta = getmetatable(myTable)
print(retrievedMeta == myMetatable) -- Sortie : trueEssayez vous-même
function attachMetatable(mainTable, metaTable)
-- Écrire le code ici
end
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logic & Flow
1Itération avancée des tables
Itérer avec pairs()Itérer avec ipairs()pairs() vs. ipairs()Récapitulatif - Fiche de personnage4Introduction aux Metatables
Qu'est-ce qu'une Metatable ?setmetatable & getmetatableLa métaméthode __indexLa métaméthode __newindexLa métaméthode __tostringMétaméthodes arithmétiques - Partie 1Métaméthodes arithmétiques - Partie 2Récapitulatif - Table en lecture seule2Plus de fonctions de la bibliothèque table
table.concat()Construction de table & unpack()table.sort()Tri personnalisé avec des fonctionsRécapitulatif - Tableau des scores3Concepts avancés sur les fonctions
Retourner plusieurs valeursFonctions variadiques (...)Les fonctions comme valeurs de première classeFonctions anonymesQu'est-ce qu'une closure ?Récapitulatif - Gestionnaire d'événements simple