Menu
Coddy logo textTech

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

Maintenant, 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.

challenge icon

Défi

Facile

Construisons 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 classe Book avec le modèle de prototype standard. 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'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 :

  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 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 Orwell

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

Lorsque 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çoive self
  • 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 __tostring automatiquement

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

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 Object Oriented Programming