Traits
IntermédiaireUn trait définit un comportement partagé, comme une interface.
trait Resumable {
fn resume(&self) -> String;
// implémentation par défaut
fn apercu(&self) -> String {
format!("{}...", &self.resume()[..10.min(self.resume().len())])
}
}
impl Resumable for Utilisateur {
fn resume(&self) -> String { format!("{} <{}>", self.nom, self.email) }
}
// Trait bound : accepter tout type qui implémente Resumable
fn afficher_resume(item: &impl Resumable) { println!("{}", item.resume()); }
// Trait object : polymorphisme dynamique (dispatch à l'exécution)
let elements: Vec<Box<dyn Resumable>> = vec![Box::new(u)];
Astuce :
impl Trait/ génériques = dispatch statique (rapide, code dupliqué à la compilation).dyn Trait= dispatch dynamique (une indirection, utile pour des collections hétérogènes).