Menu
CoddyTech

Concaténer des objets

Fait partie de la section Programmation orientée objet du Journey Lua de Coddy. Leçon 28 sur 70.

L’opérateur .. en Lua concatène des chaînes, mais que faire si tu veux combiner un objet avec une chaîne ? La méthode métaméthodique __concat te permet de définir exactement comment cela doit fonctionner.

Lorsque Lua rencontre a .. b et qu’un opérande possède une métaméthode __concat, il appelle cette fonction avec les deux valeurs. C’est utile lorsque tu veux que les objets s’intègrent naturellement aux expressions de chaînes.

local Name = {}
Name.__index = Name

function Name:new(first, last)
    local obj = {first = first, last = last}
    setmetatable(obj, Name)
    return obj
end

function Name.__concat(a, b)
    if type(a) == "string" then
        return a .. b.first .. " " .. b.last
    else
        return a.first .. " " .. a.last .. b
    end
end

Remarque que la fonction vérifie quel opérande est la chaîne de caractères. Comme .. peut être utilisé sous la forme "Hello " .. obj ou obj .. "!", ta métaméthode doit gérer les deux cas.

local person = Name:new("Ada", "Lovelace")

print("Dr. " .. person)      -- Sortie : Dr. Ada Lovelace
print(person .. " PhD")      -- Sortie : Ada Lovelace PhD

Comme les autres métaméthodes d’opérateur, __concat s’écrit avec un point par convention et reçoit les deux opérandes en arguments. La principale différence avec les métaméthodes arithmétiques, c’est que tu travailles généralement avec des types différents : ton objet et une chaîne.

challenge icon

Défi

Facile

Créons une classe Title qui peut s'intégrer naturellement aux expressions de chaînes à l'aide de l'opérateur ... C'est utile lorsque tu veux combiner des objets et des chaînes de manière lisible et intuitive, par exemple pour ajouter des titres honorifiques ou des suffixes au titre d'une personne.

Tu organiseras ton code dans deux fichiers :

  • Title.lua : définis ta classe Title avec un champ text qui stocke la chaîne du titre. Inclus un constructeur :new(text) et implémente la métaméthode __concat. Ta métaméthode doit gérer les deux cas : lorsqu'une chaîne précède l'objet ("prefix" .. obj) et lorsqu'une chaîne le suit (obj .. "suffix"). Le résultat doit combiner la chaîne avec le texte du titre de manière appropriée.
  • main.lua : importe ton module Title, crée une instance de titre et démontre la concaténation dans les deux sens.

Tu recevras trois entrées :

  1. Le texte du titre (par exemple, "Engineer")
  2. Une chaîne de préfixe à placer avant le titre (par exemple, "Senior ")
  3. Une chaîne de suffixe à placer après le titre (par exemple, " III")

Dans ton fichier principal, crée un Title avec le texte donné. Effectue ensuite deux concaténations et affiche chaque résultat sur une ligne distincte :

  1. Concatène la chaîne de préfixe avec l'objet titre
  2. Concatène l'objet titre avec la chaîne de suffixe

Par exemple, si les entrées sont Engineer, Senior et III, la sortie devrait être :

Senior Engineer
Engineer III

La première ligne montre le préfixe combiné au titre, et la deuxième ligne montre le titre combiné au suffixe. Ta métaméthode __concat permet cette combinaison naturelle de chaînes !

Essayez vous-même

-- Lire les entrées
local titleText = io.read()
local prefix = io.read()
local suffix = io.read()

-- Charger le module Title
local Title = require('Title')

-- TODO: Créer une instance de Title avec le titleText donné

-- TODO: Concaténer prefix avec l’objet title et afficher le résultat

-- TODO: Concaténer l’objet title avec suffix et afficher le résultat
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