capypad
0 Tage Serie
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
rust
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