Macro stry_common::capture [−][src]
A macro that allows you to clone, reference or copy variables captured by a closure.
Clone (default)
Without any other modifiers the default action taken for arguments is to clone them.
Syntax
ⓘ
capture!(var) // let var = var.clone(); capture!(mut var) // let mut var = var.clone(); capture!(var1 => var2) // let var2 = var1.clone(); capture!(var1 => mut var2) // let mut var2 = var1.clone();
Copy
Copying is possible my adding a *
to the appropriate argument.
Syntax
ⓘ
capture!(*var) // let var = *var; capture!(mut *var) // let mut var = *var; capture!(*var1 => var2) // let var2 = *var1; capture!(*var1 => mut var2) // let mut var2 = *var1;
References
You can reference a argument by adding the ref
keyword to it.
Syntax
ⓘ
capture!(ref var) // let var = &var; capture!(mut ref var) // let mut var = &var; capture!(ref mut var) // let var = &mut var; capture!(mut ref mut var) // let mut var = &mut var; capture!(ref var1 => var2) // let var2 = &var1; capture!(ref var1 => mut var2) // let mut var2 = &var1; capture!(ref mut var1 => var2) // let var2 = &mut var1; capture!(ref mut var1 => mut var2) // let mut var2 = &mut var1;
Note
References’ syntax complexity increases along with you use case.
The order between ref mut
and mut ref
matters!
Examples
use std::sync::{Arc, Mutex, atomic::{AtomicBool, Ordering}}; fn test() { let arc_atomic = Arc::new(AtomicBool::new(false)); let arc_mutex = Arc::new(Mutex::new(Ordering::AcqRel)); run({ fenn::capture!(arc_atomic, arc_mutex => mutex); move || { let lock = mutex.lock().unwrap(); arc_atomic.store(true, *lock); } }); } fn run(f: impl FnOnce() -> ()) { f(); }