rust / intermediate
Snippet
Generische Funktionen mit where Klauseln: Fortgeschrittene Trait-Bounds
Generische Funktionen in Rust werden mächtig durch Trait-Bounds, die einschränken, welche Typen akzeptabel sind. Die where Klausel-Syntax bietet eine sauberere Alternative zu Inline-Trait-Bounds, besonders bei mehreren Einschränkungen. Hier bedeutet T: Display + Debug + Clone, dass T alle drei Traits implementieren muss. Sie können auch mehrere Typparameter (T, U) mit unterschiedlichen Einschränkungen haben, was flexible Funktionssignaturen ermöglicht.
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
36
37
38
39
40
41
42
43
44
45
46
use std::fmt::{Display, Debug};#[derive(Debug)]struct Container<T> {value: T,}impl<T> Container<T> {fn new(value: T) -> Self {Container { value }}}trait Printable {fn format_for_print(&self) -> String;}impl<T: Display + Debug> Printable for Container<T> {fn format_for_print(&self) -> String {format!("Debug: {:?}, Display: {}", self.value, self.value)}}fn print_all<T>(items: &[T], prefix: &str)whereT: Display + Debug + Clone,{for item in items {println!("{}: {:?}", prefix, item);}}fn compare_and_print<T, U>(left: &T, right: &U)whereT: Display + PartialOrd,U: Display + Debug,{println!("Left: {}, Right: {:?}", left, right);}fn main() {let nums = Container::new(42);println!("{}", nums.format_for_print());print_all(&[1, 2, 3], "Number");compare_and_print(&10.5, &"hello");}
Erklärung
1
where T: Display + Debug + Clone,
where Klausel gruppiert mehrere Trait-Bounds für Lesbarkeit
2
for item in items {
Iteriert über geliehene Slice, ohne Besitz zu nehmen
3
fn compare_and_print<T, U>(left: &T, right: &U)
Mehrere Typparameter mit jeweils eigenen Trait-Einschränkungen
4
T: Display + PartialOrd, U: Display + Debug
Unterschiedliche Bounds für verschiedene generische Parameter