La metaméthode __tostring
Fait partie de la section Logique et flux du Journey Lua de Coddy. Leçon 20 sur 54.
Lorsque vous affichez une table en Lua, vous voyez généralement quelque chose d’inutile comme table: 0x5f8a20, c’est-à-dire simplement une adresse mémoire. La métaméthode __tostring vous permet de modifier ce comportement en définissant exactement ce qui doit être affiché lorsque votre table est convertie en chaîne.
Cette métaméthode est particulièrement utile pour le débogage et la création d’une sortie plus claire. Lorsque Lua doit convertir votre table en chaîne (par exemple lors de l’utilisation de print()), il vérifie si la table possède une métatable avec un champ __tostring. Si c’est le cas, Lua appelle cette fonction et utilise sa valeur de retour au lieu de la représentation par défaut.
Voici comment l’implémenter :
local vector = {x = 3, y = 4}
local meta = {
__tostring = function(t)
return "Vector(" .. t.x .. ", " .. t.y .. ")"
end
}
setmetatable(vector, meta)
print(vector) -- Sortie : Vector(3, 4)La fonction __tostring reçoit la table comme argument et doit renvoyer une chaîne. Dans cet exemple, elle construit une chaîne formatée affichant les valeurs x et y du vecteur dans un format lisible.
Cela rend votre code beaucoup plus facile à utiliser. Au lieu de voir des adresses mémoire énigmatiques lors du débogage, vous obtenez des informations significatives sur le contenu de votre table.
Défi
FacileÉcrivez une fonction createPoint qui prend les coordonnées x et y et renvoie une table représentant un point avec une représentation textuelle personnalisée.
Créez une table avec les champs x et y, associez-lui une métatable avec la métaméthode __tostring, puis renvoyez le résultat de la conversion de la table en chaîne à l’aide de tostring().
Logique :
- Créez une table avec les clés
xetydéfinies sur les coordonnées fournies - Créez une métatable avec
__tostringqui renvoie une chaîne au format"Point(x, y)" - Associez la métatable à la table du point à l’aide de
setmetatable() - Renvoyez
tostring(point)pour obtenir la représentation textuelle personnalisée
Paramètres :
x(nombre) : la coordonnée x du pointy(nombre) : la coordonnée y du point
Renvoie : la représentation textuelle personnalisée du point au format "Point(x, y)" (chaîne)
Essayez vous-même
function createPoint(x, y)
-- Écrivez 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() contre ipairs()Récapitulatif - Fiche de personnage2Fonctions supplémentaires de la bibliothèque table
table.concat()construction de tables et unpack()table.sort()Tri personnalisé avec des fonctionsRécapitulatif - Tableau des meilleurs scores3Concepts avancés des fonctions
Retourner plusieurs valeursFonctions variadiques (...)Les fonctions comme valeurs de première classeFonctions anonymesQu’est-ce qu’une fermeture ?Récapitulatif - Gestionnaire d’événements simpleEntraînez-vous par vous-même : Compilateur Lua en ligne