向闭包传递变量

说明

默认情况下,闭包从环境中借用捕获。或者你可以用move闭包来将环境的所有权全给闭包。然而,一般情况下你是想传递一部分变量到闭包中,如一些数据的拷贝、传引用或者执行一些其他操作。

这种情况应在不同的作用域里进行变量重绑定。

示例

像这样


#![allow(unused)]
fn main() {
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;
    }
};
}

而不是


#![allow(unused)]
fn main() {
use std::rc::Rc;

let num1 = Rc::new(1);
let num2 = Rc::new(2);
let num3 = Rc::new(3);

let num2_cloned = num2.clone();
let num3_borrowed = num3.as_ref();
let closure = move || {
    *num1 + *num2_cloned + *num3_borrowed;
};
}

优点

这样在闭包定义的时候就把哪些是复制的数据搞清楚,这样结束时无论闭包有没有消耗掉这些值,都会及早drop掉。

闭包能用与上下文相同的变量名来用那些复制或者move进来的变量。

缺点

增加了闭包内的实现代码行数。