rust / expert
Snippet
HRTB (Higher-Rank Trait Bounds) zur Abstraktion von Lebensdauern in Closure-Argumenten
Dieses Beispiel zeigt die Verwendung von Higher-Rank Trait Bounds (HRTB) mit der `for<'a>`-Syntax. Durch HRTB legen wir fest, dass die Closure eine Referenz mit einer beliebigen Lebensdauer `'a` akzeptieren muss (speziell Lebensdauern innerhalb von `execute_with_borrow`), anstatt auf eine feste Lebensdauer festgelegt zu sein, die vom Aufrufer gewählt wurde.
snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
pub fn execute_with_borrow<F>(f: F)wherefor<'a> F: Fn(&'a str) -> &'a str,{let local_data = String::from("temporary string");let result = f(&local_data);println!("Processed result: {}", result);}fn main() {execute_with_borrow(|s| {if s.len() > 5 {&s[..5]} else {s}});}
Erklärung
1
for<'a> F: Fn(&'a str) -> &'a str
Deklariert, dass die Closure `F` mit einer Referenz einer *beliebigen* Lebensdauer `'a` aufgerufen werden kann.
2
let local_data = String::from("...")
Eine lokale Zeichenfolge, die innerhalb des Funktionsbereichs zugewiesen wird.
3
let result = f(&local_data)
Übergibt eine Referenz von `local_data` an die Closure. Die Lebensdauer dieser Referenz ist lokal für diesen Funktionsaufruf.
4
|s| if s.len() > 5 { &s[..5] } else { s }
Die Closure leiht die Eingabereferenz aus und gibt ein Slice zurück, das an dieselbe beliebige Lebensdauer gebunden ist.