Menu
Coddy logo textTech

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 .. ")"
end

Dé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.

challenge icon

Défi

Facile

Construisons 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 classe Book avec le modèle standard basé sur un prototype. Chaque livre doit stocker un title et un author. Incluez un constructeur :new(title, author) et implémentez la métaméthode __tostring afin 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 :

  1. Titre du premier livre
  2. Auteur du premier livre
  3. Titre du deuxième livre
  4. 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 Orwell

N'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))

quiz iconTestez-vous

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

Entraînez-vous par vous-même : Compilateur Lua en ligne