Rust variable rebinding for closure
From: https://rust-unofficial.github.io/patterns/idioms/pass-var-to-closure.html
Rust closure captures variables by reference by default.
You can use “move” keyword to change to move variables.
In most cases, some variables are moved, and some are referenced.
We can rebind variables in a separate scope before move to the closure.
use std::rc::Rc;
let num1 = Rc::new(1);
let num2 = Rc::new(2);
let num3 = Rc::new(3);
let closure = {
// `num1` is moved
let num2 = num2.clone(); // `num2` is cloned
let num3 = num3.as_ref(); // `num3` is borrowed
move || {
*num1 + *num2 + *num3;
}
};
Or we can use additional variables to move in the same scope:
let num2_clone = num2.clone();
let num3_ref = num3.as_ref();
let closure = move || {
*num1 + *num2_clone + *num3_ref
}
Using separate scope can reuse the variable name, which make the closure body clearer,
but need additional indent.