rust / intermediate
Snippet
Benutzerdefinierte Trait-Implementierung
Traits definieren gemeinsames Verhalten. Hier wird Summable sowohl für [i32] als auch Vec<i32> implementiert. Generische Funktionen wie print_stats verwenden Trait-Bounds um jeden Typ zu akzeptieren, der Summable implementiert. Dies erreicht Polymorphie ohne Vererbung.
snippet.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
trait Summable {fn sum(&self) -> i32;fn count(&self) -> usize;}impl Summable for [i32] {fn sum(&self) -> i32 {self.iter().fold(0, |acc, &x| acc + x)}fn count(&self) -> usize {self.len()}}impl Summable for Vec<i32> {fn sum(&self) -> i32 {self.as_slice().sum()}fn count(&self) -> usize {self.len()}}fn print_stats<T: Summable>(items: &T) {println!("Count: {}, Sum: {}", items.count(), items.sum());}fn main() {let arr = [1, 2, 3, 4, 5];let vec = vec![10, 20, 30];print_stats(&arr);print_stats(&vec);}
Erklärung
1
trait Summable {
Definiert Trait mit zwei Methodensignaturen
2
impl Summable for [i32] {
Implementiert Trait direkt für Slice-Typ
3
impl Summable for Vec<i32> {
Implementiert Trait für Vec, delegiert an Slice-Implementierung
4
fn print_stats<T: Summable>(items: &T)
Generische Funktion eingeschränkt durch Trait-Bound