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
endRemarque 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 PhDComme 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.
Défi
FacileCré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 champtextqui 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 :
- Le texte du titre (par exemple, "Engineer")
- Une chaîne de préfixe à placer avant le titre (par exemple, "Senior ")
- 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 :
- Concatène la chaîne de préfixe avec l'objet titre
- 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 IIILa 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
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