</>
Plan du cours — 19/66

Traits

Intermédiaire

Un 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).