Formatage de chaînes
Fait partie de la section Programmation orientée objet 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.
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 Programmation orientée objet
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 RectangleClasse CercleMéthode PérimètreCollection de formesAire totaleFiltrer les formes2Modè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 formesEntraînez-vous par vous-même : Compilateur Lua en ligne