rust / intermediate
Snippet
Trait-Grenzen und generische Einschränkungen
Trait-Grenzen beschränken generische Typen so, dass nur Werte akzeptiert werden die bestimmte Verhaltensweisen implementieren. Man kann mehrere Grenzen mit + kombinieren. Die impl Trait Syntax bietet eine kürzere Schreibweise um Einschränkungen in Funktionssignaturen anzugeben. Rückgabetypen können ebenfalls impl Trait verwenden um anzudeuten, dass etwas ein Trait implementiert ohne den konkreten Typ zu spezifizieren.
snippet.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use std::fmt::{Display, Debug};fn print_debug<T: Debug>(value: T) {println!("{:?}", value);}fn compare_and_display<T: Display + PartialOrd>(a: T, b: T) {println!("{} vs {}", a, b);}fn dynamic_display(item: impl Display + Debug) {println!("Debug: {:?}, Display: {}", item, item);}fn returns_comparable() -> impl PartialOrd {42}
Erklärung
1
fn print_debug<T: Debug>(value: T)
Generische Funktion bei der T das Debug Trait implementieren muss um Debug-Formatierung zu ermöglichen
2
fn compare_and_display<T: Display + PartialOrd>
T muss sowohl Display als auch PartialOrd implementieren, was Ausgabe und Vergleich ermöglicht
3
fn dynamic_display(item: impl Display + Debug)
impl Trait Syntax als Alternative zur generischen Syntax für dieselbe Einschränkung
4
fn returns_comparable() -> impl PartialOrd
Rückgabetyp verbirgt konkreten Typ aber verspricht dass er PartialOrd implementiert