11-向闭包传递变量
向闭包传递变量 — Rust Design Patterns
译文 · 基于 Rust Design Patterns
原文链接: https://rust-unofficial.github.io/patterns/idioms/pass-var-to-closure.html
向闭包传递变量
描述
默认情况下,闭包通过借用捕获其环境。也可以使用 move 闭包来移动整个环境。然而,你常常只想把部分变量移入闭包、给它一份数据的副本、按引用传递,或做其他某种转换。
为此,在单独的作用域中重新绑定变量。
示例
使用
1
2
3
4
5
6
7
8
9
10
11
12
13
| use std::rc::Rc;
let num1 = Rc::new(1);
let num2 = Rc::new(2);
let num3 = Rc::new(3);
let closure = {
// `num1` 被移动
let num2 = num2.clone(); // `num2` 被克隆
let num3 = num3.as_ref(); // `num3` 被借用
move || {
*num1 + *num2 + *num3;
}
};
|
而不是
1
2
3
4
5
6
7
8
9
10
11
| 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;
};
|
优点
被复制的数据与闭包定义放在一起,因此其用途更清晰;即使闭包没有消耗它们,它们也会立即被丢弃。
无论数据是被复制还是被移动,闭包都使用与周围代码相同的变量名。
缺点
闭包体会多一层缩进。