Leçons du module (2/2)
Traits et Trait Bounds
Les traits définissent le comportement qu'un type particulier possède et peut partager avec d'autres types. Nous pouvons utiliser les traits pour définir un ensemble de méthodes qui représentent une certaine fonctionnalité ou interface commune, de manière similaire aux interfaces dans d'autres langages de programmation.
Les trait bounds (restrictions de trait) permettent de spécifier qu'un type générique doit implémenter un certain trait, garantissant que les méthodes requises soient disponibles à la compilation.
Définir et implémenter un trait
Pour définir un trait, nous utilisons le mot-clé trait suivi des signatures des méthodes que les types devront implémenter :
pub trait Summary {
fn summarize(&self) -> String;
}
Pour implémenter un trait sur un type concret, nous utilisons la syntaxe impl TraitName for TypeName :
pub struct NewsArticle {
pub headline: String,
pub content: String,
}
impl Summary for NewsArticle {
fn summarize(&self) -> String {
format!("{}", self.headline)
}
}
Trait Bounds (Restrictions de Trait)
Lorsque nous écrivons des fonctions génériques, nous pouvons contraindre les paramètres de type pour nous assurer qu'ils implémentent un trait spécifique. La syntaxe standard est <T: Trait> :
pub fn notify<T: Summary>(item: &T) {
println!("Notifica: {}", item.summarize());
}
Alternativement, pour des signatures plus complexes, nous pouvons utiliser la clause where :
pub fn notify_advanced<T>(item: &T)
where
T: Summary
{
println!("Notifica: {}", item.summarize());
}
À toi de jouer
Exercice 1 : Le Trait Summary
Définis un trait appelé Summary contenant la signature de la méthode fn summarize(&self) -> String;. Ensuite, définis une struct NewsArticle avec un champ headline de type String et implémente le trait Summary pour celle-ci afin que la méthode summarize retourne la valeur du champ headline.
Afficher l'indice
Définis le trait `Summary`et la struct`NewsArticle`. Implémente avec `impl Summary for NewsArticle`en clonant le champ`self.headline.clone()`.
Solution disponible après 3 tentatives
Exercice 2 : Trait Bounds avec print_summary
En te basant sur le code de l'exercice précédent, définis une fonction générique appelée print_summary<T> qui accepte un paramètre item de type &T. Applique une restriction (trait bound) pour que T doive implémenter le trait Summary. À l'intérieur de la fonction, affiche le résultat renvoyé par item.summarize().
Afficher l'indice
Utilise la signature `fn print_summary<T: Summary>(item: &T)`et appelle`item.summarize()`à l'intérieur du`println!`.
Solution disponible après 3 tentatives
Exercice 3 : Calcul de l'Aire via Trait
Définis un trait appelé Area avec la méthode fn area(&self) -> f64;. Crée une struct Circle contenant un champ radius de type f64, et implémente le trait Area pour celle-ci en calculant l'aire (formule : radius * radius * 3.14159).
Afficher l'indice
Définis le trait `Area`et la struct`Circle`. Implémente `area(&self)` en utilisant la formule du cercle.
Solution disponible après 3 tentatives