Formatage de chaînes
Fait partie de la section Object Oriented Programming du Journey Lua de Coddy — leçon 16 sur 70.
Lorsque vous affichez un objet directement, Lua affiche quelque chose de peu utile comme table: 0x55a...—simplement une adresse mémoire. La métaméthode __tostring vous permet de définir exactement quelle chaîne de caractères représente votre objet lorsqu'il est affiché ou converti en texte.
Dans le modèle de classe, vous ajoutez __tostring en tant que fonction dans votre table de classe. Puisque la classe elle-même sert de métatable pour les instances, Lua trouve et utilise automatiquement cette fonction :
local Player = {}
Player.__index = Player
function Player:new(name, level)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.level = level
return instance
end
function Player:__tostring()
return "Player: " .. self.name .. " (Level " .. self.level .. ")"
endMaintenant, lorsque vous affichez une instance de Player, Lua appelle automatiquement votre méthode __tostring :
local hero = Player:new("Luna", 5)
print(hero) -- Résultat : Player : Luna (Niveau 5)Notez que __tostring utilise la syntaxe avec deux-points et reçoit self, vous donnant accès à toutes les données de l'instance. La fonction doit retourner une chaîne de caractères — vous pouvez la formater de la manière qui convient le mieux à votre objet, en combinant tous les attributs dans une représentation lisible.
Défi
FacileConstruisons une classe Book qui sait comment se présenter ! Lorsque vous imprimez un livre directement, Lua affichera une chaîne de caractères joliment formatée au lieu d'une adresse mémoire cryptique — tout cela grâce à la métaméthode __tostring.
Vous organiserez votre code sur deux fichiers :
Book.lua: Définissez votre classeBookavec le modèle de prototype standard. Chaque livre doit stocker untitleet unauthor. Incluez un constructeur:new(title, author)et implémentez la métaméthode__tostringafin que l'impression d'un livre affiche ses informations dans un format lisible.main.lua: Importez votre module Book, créez des instances de livre et imprimez-les directement pour voir votre formatage de chaîne personnalisé en action.
Votre méthode __tostring doit retourner une chaîne dans ce format exact :
"[title]" by [author]Notez que le titre est entouré de guillemets doubles dans la chaîne de sortie.
Vous recevrez quatre entrées :
- Titre du premier livre
- Auteur du premier livre
- Titre du deuxième livre
- Auteur du deuxième livre
Dans votre fichier principal, créez deux livres en utilisant les entrées fournies et imprimez chaque livre directement (pas en appelant une méthode — juste print(book)). Chaque livre doit apparaître sur sa propre ligne.
Par exemple, si les entrées sont The Hobbit, J.R.R. Tolkien, 1984, et George Orwell, la sortie devrait être :
"The Hobbit" by J.R.R. Tolkien
"1984" by George OrwellN'oubliez pas que __tostring doit retourner une chaîne de caractères, et puisque votre table de classe sert de métatable pour les instances, Lua trouvera et utilisera automatiquement votre fonction __tostring lorsque vous imprimerez un livre.
Aide-mémoire
La métaméthode __tostring définit comment un objet est représenté sous forme de chaîne de caractères lorsqu'il est affiché ou converti en texte.
Sans __tostring, l'affichage d'un objet ne montre que son adresse mémoire :
print(someObject) -- Output: table: 0x55a...Ajoutez __tostring en tant que méthode dans votre classe pour personnaliser la représentation textuelle :
local Player = {}
Player.__index = Player
function Player:new(name, level)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.level = level
return instance
end
function Player:__tostring()
return "Player: " .. self.name .. " (Level " .. self.level .. ")"
endLorsque vous affichez une instance, Lua appelle automatiquement __tostring :
local hero = Player:new("Luna", 5)
print(hero) -- Output: Player: Luna (Level 5)Points clés :
- Utilisez la syntaxe avec deux-points (
:) pour que la méthode reçoiveself - Doit retourner une chaîne de caractères
- Accédez aux données de l'instance via
self - Puisque la table de classe sert de métatable, Lua trouve
__tostringautomatiquement
Essayez vous-même
-- Requiert le module Book
local Book = require('Book')
-- Lire les entrées
local title1 = io.read()
local author1 = io.read()
local title2 = io.read()
local author2 = io.read()
-- TODO: Créer deux instances de livre en utilisant Book:new()
-- TODO: Imprimer chaque livre directement (utilisez simplement print(book))
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Object Oriented Programming
1Le concept de « self »
Tables avec fonctions« self » expliciteLa syntaxe avec deux-pointsPoint vs deux-pointsRécapitulatif - Point mobile4Projet : Banque numérique
Configuration du projetMéthode de dépôt7Polymorphisme et Redéfinition
Redéfinition de méthodesAppeler des méthodes parentesDuck TypingInterface communeVérification du typeRécapitulatif - Rôles des employés10Projet : Gestionnaire de formes
Configuration du projetClasse Rectangle2Modèle de prototype de classe
Le concept de prototypeLiaison avec __indexLe constructeur :new()Initialisation des attributsInstances indépendantesRécapitulatif - Usine de voitures5Surcharge d'opérateurs en POO
Additionner des objetsSoustraire des objetsConcaténer des objetsComparer des objets (<, >)Récapitulatif - Calculs de portefeuille8Encapsulation
Conventions de nommageClosures pour la confidentialitéAccès via les ClosuresTables en lecture seuleLogique de validationRécapitulatif - Coffre-fort sécurisé11Patrons de conception (Lite)
Fonctions FactoryTable SingletonPatron IteratorObserver (Écouteur)Récapitulatif - Logger Factory3État et comportement des objets
Variables d'instanceMéthodes GetterMéthodes SetterPropriétés calculéesFormatage de chaînesVérifications d'égalitéRécapitulatif - Note de l'étudiant6Bases de l'héritage
Mise en place de l'héritageHériter des méthodesÉtendre le constructeurAjouter des méthodes enfantsPartagé vs UniqueRécapitulatif - Hiérarchie des formes