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
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)whereT: 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