setmetatable & getmetatable
Fait partie de la section Logique et flux 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)
Essayez 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 Logique et flux
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