Traits
Un trait est une sorte d'interface abstraite que des types peuvent implémenter (en gros c'est une liste de méthodes).
Pouvoir être additionné
On peut additionner des i32. Le type i32 implémente le trait Add.
#![allow(unused)] fn main() { struct Point { x: i32; y: i32; } impl Add for Point { type Output = Self; fn add(self, other: Self) -> Self::Output { x: self.x + other.x, y: self.y + other.y, } } println!({}, Point { x: 1, y: 0 } + Point { x: 2, y: 3 }); }
En fait, on peut "dériver" que implémenter le trait Add se fait en utilisant le trait Add déjà implémenté sur chaque champ :
#![allow(unused)] fn main() { #[derive(Add)] struct Point2D { x: i32, y: i32, } }
Définir un trait
Contrairement aux interfaces en Java, aux classes abstraites (où tout est abstrait) en C++, Python, on peut ajouter une implémentation d'un trait sur n'importe quel type, y compris un type existant comme un entier sur 32 bits. On n'est pas obligé de modifier "une classe" pour y ajouter un trait. Par exemple :
trait Colored {
fn is_red(&self) -> bool;
}
impl Colored for i32 {
fn is_red(&self) -> bool {
return self % 2 == 0;
}
}
En Java, C++, on ne peut pas avec des classes faire cela avec de l'héritage. Il faudrait modifier la "classe i32".