Chaînage de méthodes
Fait partie de la section Programmation Orientée Objet du Journey Rust de Coddy. Leçon 6 sur 61.
Jusqu’à présent, nos méthodes mutables ont modifié la structure et n’ont rien renvoyé. Mais que faire si nous voulons appeler plusieurs méthodes à la suite sur la même instance ? En renvoyant une référence vers self, nous permettons le chaînage de méthodes : un modèle dans lequel plusieurs appels de méthodes s’enchaînent au sein d’une seule expression.
L’essentiel est que vos méthodes &mut self renvoient &mut Self :
struct Config {
debug: bool,
timeout: u32,
}
impl Config {
fn new() -> Config {
Config { debug: false, timeout: 30 }
}
fn set_debug(&mut self, value: bool) -> &mut Self {
self.debug = value;
self
}
fn set_timeout(&mut self, seconds: u32) -> &mut Self {
self.timeout = seconds;
self
}
}
Chaque méthode modifie la structure, puis renvoie self : une référence mutable vers la même instance. Cela permet à l’appel de méthode suivant de continuer immédiatement à travailler dessus :
fn main() {
let mut config = Config::new();
config.set_debug(true).set_timeout(60);
println!("Debug: {}, Timeout: {}", config.debug, config.timeout);
// Sortie : Debug: true, Timeout: 60
}
Au lieu d’écrire trois instructions distinctes, nous configurons tout en une seule ligne fluide. Ce modèle de type « builder » est particulièrement utile lors de la configuration d’objets comportant de nombreux paramètres facultatifs, ce qui rend votre code plus concis et plus lisible.
Défi
FacileCréez une structure TextStyle avec trois champs : bold (bool), italic (bool) et size (u32).
Ajoutez un bloc d’implémentation pour TextStyle avec les éléments suivants :
new: une fonction associée qui renvoie unTextStyleavecbolddéfini surfalse,italicdéfini surfalseetsizedéfini sur12set_bold: prend&mut selfet une valeurbool, définit le champ bold et renvoie&mut Selfpour permettre l’enchaînementset_italic: prend&mut selfet une valeurbool, définit le champ italic et renvoie&mut Selfpour permettre l’enchaînementset_size: prend&mut selfet une valeuru32, définit le champ size et renvoie&mut Selfpour permettre l’enchaînement
Vous recevrez trois entrées :
- Première ligne : paramètre gras (
trueoufalse) - Deuxième ligne : paramètre italique (
trueoufalse) - Troisième ligne : taille de police (u32)
Créez un TextStyle mutable à l’aide de new, puis utilisez l’enchaînement de méthodes pour appliquer les trois paramètres dans une seule expression. Affichez l’état final au format indiqué ci-dessous.
Format de sortie attendu :
Bold: {bold}, Italic: {italic}, Size: {size}Essayez vous-même
use std::io;
// TODO: Définir la structure TextStyle ici
// TODO: Ajouter le bloc d'implémentation pour TextStyle avec :
// - fonction associée new()
// - méthode set_bold()
// - méthode set_italic()
// - méthode set_size()
fn main() {
let mut input = String::new();
// Lire le paramètre bold
io::stdin().read_line(&mut input).expect("Failed to read line");
let bold: bool = input.trim().parse().expect("Invalid bool");
input.clear();
// Lire le paramètre italic
io::stdin().read_line(&mut input).expect("Failed to read line");
let italic: bool = input.trim().parse().expect("Invalid bool");
input.clear();
// Lire le paramètre size
io::stdin().read_line(&mut input).expect("Failed to read line");
let size: u32 = input.trim().parse().expect("Invalid u32");
// TODO: Créer un TextStyle mutable en utilisant new(), puis utiliser le chaînage de méthodes
// pour appliquer les trois paramètres en une seule expression
// TODO: Afficher le résultat au format : Bold: {bold}, Italic: {italic}, Size: {size}
}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
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