capypad
0 Tage Serie
rust / intermediate
Snippet

Generische Funktionen mit Trait-Bounds und where-Klauseln

Generische Funktionen kombiniert mit Trait-Bounds erzeugen flexiblen, wiederverwendbaren Code. Die where-Klausel bietet sauberere Syntax für komplexe Bounds. Mehrere Trait-Bounds (T: Debug + Display) erfordern, dass Typen alle angegebenen Traits implementieren.

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
use std::fmt::{Debug, Display};
 
fn print_debug_and_display<T, U>(t: &T, u: &U)
where
T: Debug + Display,
U: Debug + Clone,
{
println!("t - Debug: {:?}, Display: {}", t, t);
println!("u - Debug: {:?}, Clone: {:?}", u, u.clone());
}
 
fn largest<T: PartialOrd>(list: &[T]) -> &T {
let mut largest = &list[0];
for item in list {
if item > largest {
largest = item;
}
}
largest
}
 
#[derive(Debug)]
struct Point<T, U> {
x: T,
y: U,
}
 
impl<T: Debug, U: Debug> Debug for Point<T, U> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "Point {{ x: {:?}, y: {:?} }}", self.x, self.y)
}
}
Erklärung
1
where T: Debug + Display
Mehrere Trait-Bounds kombiniert, Typ muss beide implementieren
2
fn largest<T: PartialOrd>(list: &[T])
Einzelner Trait-Bound auf generischem Typ ermöglicht Vergleich
3
struct Point<T, U>
Generische Struktur mit zwei Typparametern für Flexibilität
4
u.clone()
Clone-Bound ermöglicht Duplizierung von Werten wenn nötig