capypad
0 Tage Serie
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
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
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)
where
T: Display + Debug + Clone,
{
for item in items {
println!("{}: {:?}", prefix, item);
}
}
 
fn compare_and_print<T, U>(left: &T, right: &U)
where
T: 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