rust / intermediate
Snippet
Closures: Umgebungsvariablen erfassen
Closures können Variablen aus ihrer umgebenden Umgebung erfassen. Rust bestimmt den Erfassungsmodus automatisch basierend darauf wie die Closure die Variable nutzt: by Reference, by Mutable Reference oder by Value. Das move Keyword zwingt eine Closure dazu Eigentümerschaft über erfasste Variablen zu übernehmen, was essentiell ist wenn Closures an Threads übergeben werden oder wenn garantierte Eigentümerschaft benötigt wird.
snippet.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fn main() {let x = 4;let equal_to_x = |z| z == x;println!("Equal to 4: {}", equal_to_x(4));let y = 4;let owns_y = move || {println!("y taken: {}", y);};let v = vec![1, 2, 3];let uses_v = || println!("v.len(): {}", v.len());uses_v();drop(v);}
Erklärung
1
let equal_to_x = |z| z == x;
Closure erfasst x by Reference da nur Lesen; funktioniert auch nach Scope-Ende von x
2
let owns_y = move || { ... }
move erzwingt Eigentumsübertragung; Closure besitzt y und kann es nutzen auch wenn y woanders den Scope verlässt
3
let uses_v = || println!("v.len(): {}", v.len())
Erfasst v by Reference da nur Lesen; v kann nach Closure-Ausführung noch gedroppt werden