Récapitulatif - Afficheur générique
Fait partie de la section Programmation Orientée Objet du Journey Rust de Coddy. Leçon 44 sur 61.
Défi
FacileConstruisons un système d’annonces flexible qui démontre la puissance des contraintes de traits ! Tu vas créer un trait Printable et une fonction générique capable d’annoncer tout type implémentant ce trait : cela montre comment les génériques et les traits fonctionnent ensemble pour créer du code réutilisable et sûr du point de vue des types.
Tu organiseras ton code sur deux fichiers :
printable.rs: définis un trait publicPrintableavec une méthodeprint_infoqui prend&selfet renvoie uneString. Crée ensuite une fonction générique publique appeléeannouncequi accepte tout typeTimplémentantPrintable. Cette fonction doit afficherAnnouncement: {info}, où{info}est le résultat de l’appel deprint_info()sur l’élément.main.rs: crée deux structures publiques qui implémententPrintable:Person: avec un champ publicname(String). Sonprint_infodoit renvoyerPerson: {name}Product: avec les champs publicsname(String) etprice(f64). Sonprint_infodoit renvoyerProduct: {name} - ${price}
announceavec chacune afin de démontrer que ta fonction générique fonctionne avec tout typePrintable.
La beauté de cette conception est que announce ne se soucie pas de recevoir un Person, un Product ou tout type futur. Il suffit que le type puisse fournir des informations grâce à print_info(). La contrainte de trait garantit cela lors de la compilation.
Ta sortie doit afficher les deux annonces :
Announcement: Person: {name}
Announcement: Product: {product_name} - ${price}Par exemple, avec les entrées Alice, Laptop et 999.99 :
Announcement: Person: Alice
Announcement: Product: Laptop - $999.99Tu recevras trois entrées : le nom de la personne, le nom du produit et le prix du produit (à analyser comme un f64).
Essayez vous-même
mod printable;
use printable::{Printable, announce};
// TODO: Définir une struct publique Person avec un champ name public (String)
// Implémenter le trait Printable pour Person
// print_info doit retourner "Person: {name}"
// TODO: Définir une struct publique Product avec des champs publics name (String) et price (f64)
// Implémenter le trait Printable pour Product
// print_info doit retourner "Product: {name} - ${price}"
fn main() {
// Lire les entrées
let mut person_name = String::new();
std::io::stdin().read_line(&mut person_name).expect("Failed to read line");
let person_name = person_name.trim().to_string();
let mut product_name = String::new();
std::io::stdin().read_line(&mut product_name).expect("Failed to read line");
let product_name = product_name.trim().to_string();
let mut price_input = String::new();
std::io::stdin().read_line(&mut price_input).expect("Failed to read line");
let price: f64 = price_input.trim().parse().expect("Failed to parse price");
// TODO: Créer une instance de Person avec person_name
// TODO: Créer une instance de Product avec product_name et price
// TODO: Appeler announce avec le Person
// TODO: Appeler announce avec le Product
}
Toutes les leçons de Programmation Orientée Objet
1Méthodes et comportement
Introduction aux blocs d'implémentationLe paramètre SelfMéthodes mutablesFonctions associéesBlocs d'implémentation multiplesChaînage de méthodesRécapitulatif - Actions sur le rectangle4Projet : Animal virtuel
Définir l'animalNourrir l'animal7Traits standards
Le trait DebugLe trait DisplayClone et CopyLes traits d'égalitéRécapitulatif - Point affichable10Projet : Système de documents
Le trait DrawComposant texte2Encapsulation et modules
Bases des modulesLe mot-clé publicChamps privésGettersSettersRécapitulatif - Casier sécurisé5Généricité
Structures génériquesMéthodes génériquesPlusieurs types génériquesFonctions génériquesRécapitulatif - Point de coordonnées8Les Traits comme contraintes
Syntaxe des contraintes de traitContraintes multiplesLa clause whereRetourner des types avec des traitsRécapitulatif - Afficheur générique11Design Patterns en Rust
Le pattern NewtypeCompositionLe trait DropFrom et IntoRécapitulatif - Mock de Smart Pointer3Enums avancées
Enums avec donnéesMéthodes sur les EnumsMatching des variantes de donnéesL'Enum Option revisitéeRécapitulatif - Enum Shape6Définition des Traits
Qu'est-ce qu'un Trait ?Implémenter des TraitsImplémentations par défautRedéfinir les comportements par défautTraits avec paramètresRécapitulatif - Lecteur multimédiaEntraînez-vous par vous-même : Compilateur Rust en ligne