传递变量到闭包

描述

默认情况下,闭包通过借用来捕获其环境。或者你可以使用 move-closure 来移动整个环境。 然而,你往往只想把一些变量转移到闭包中,给它一些数据的拷贝,通过引用传递,或者执行一些其他的转换。

为此,在单独的作用域中使用变量重绑定。

例子

使用


#![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;
};
}

优势

复制的数据和闭包定义在一起,所以它们的目的更明确,而且即使它们没有被闭包消耗,也会被立即丢弃。

无论数据是被复制还是被移动,闭包都使用与周围代码相同的变量名。

劣势

闭包体的额外缩进。

Latest commit 9834f57 on 25 Aug 2021