Menu
Coddy logo textTech

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 .. de Lua concatène des chaînes, mais que faire si vous voulez combiner un objet avec une chaîne ? La métaméthode __concat vous permet de définir exactement comment cela doit fonctionner.

Lorsque Lua rencontre a .. b et qu’un operand possède une __concat metamethod, il appelle cette fonction avec les deux valeurs. Cela est utile lorsque vous voulez 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

Notez que la fonction vérifie quel opérande est la chaîne. Puisque .. peut être utilisé comme "Hello " .. obj ou obj .. "!", votre 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 utilise la syntaxe avec un point et reçoit les deux opérandes comme arguments. La principale différence avec les métaméthodes arithmétiques est que vous travaillez généralement avec des types mixtes. Votre objet et une chaîne.

challenge icon

Défi

Facile

Construisons une classe Title qui peut s’intégrer naturellement aux expressions de chaînes à l’aide de l’opérateur ... Cela est utile lorsque vous souhaitez combiner des objets avec des chaînes de manière lisible et intuitive, par exemple pour ajouter des titres honorifiques ou des suffixes au titre d’une personne.

Vous organiserez votre code sur deux fichiers :

  • Title.lua : définissez votre classe Title avec un champ text qui stocke la chaîne du titre. Incluez un constructeur :new(text) et implémentez la métaméthode __concat. Votre 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 correctement la chaîne avec le texte du titre.
  • main.lua : importez votre module Title, créez une instance de titre et démontrez la concaténation dans les deux sens.

Vous recevrez 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 votre fichier principal, créez un Title avec le texte fourni. Effectuez ensuite deux concaténations et affichez chaque résultat sur une ligne distincte :

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

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

Senior Engineer
Engineer III

La première ligne montre le préfixe combiné avec le titre, et la deuxième ligne montre le titre combiné avec le suffixe. Votre métaméthode __concat rend possible 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