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 directement un objet, Lua montre quelque chose d'inutile comme table: 0x55a.... Simplement une adresse mémoire. La méthode métaméta __tostring vous permet de définir exactement quelle chaîne 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 la table de votre classe. Comme 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 .. ")"
endDésormais, lorsque vous affichez une instance de Player, Lua appelle automatiquement votre méthode __tostring :
local hero = Player:new("Luna", 5)
print(hero) -- Sortie : Player: Luna (Level 5)Notez que __tostring utilise la syntaxe avec deux-points et reçoit self, ce qui vous donne accès à toutes les données de l’instance. La fonction doit renvoyer une chaîne de caractères. Vous pouvez la formater comme cela vous semble logique pour votre objet, en combinant les attributs afin d’obtenir une représentation lisible.
Défi
FacileConstruisons une classe Book qui sait se présenter ! Lorsque vous affichez directement un livre, Lua affiche une chaîne joliment mise en forme au lieu d'une adresse mémoire incompréhensible : tout cela grâce à la métaméthode __tostring.
Vous allez organiser votre code dans deux fichiers :
Book.lua: définissez votre classeBookavec le modèle standard basé sur un prototype. Chaque livre doit stocker untitleet unauthor. Incluez un constructeur:new(title, author)et implémentez la métaméthode__tostringafin que l'affichage d'un livre présente ses informations dans un format lisible.main.lua: chargez votre module Book, créez des instances de livres et affichez-les directement pour voir votre mise en forme personnalisée des chaînes en action.
Votre méthode __tostring doit renvoyer une chaîne dans ce format exact :
"[title]" by [author]Remarquez 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 à l'aide des entrées fournies et affichez chaque livre directement (sans appeler de méthode, utilisez simplement 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 doit être :
"The Hobbit" by J.R.R. Tolkien
"1984" by George OrwellN'oubliez pas que __tostring doit renvoyer une chaîne et que, puisque votre table de classe sert de métatable pour les instances, Lua trouvera et utilisera automatiquement votre fonction __tostring lorsque vous afficherez 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: Afficher 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