【发布时间】:2017-12-07 01:47:50
【问题描述】:
我无法理解为什么特定模式无法编译。
Rust 会识别我何时移动一个变量,然后在闭包之外重新分配给它,我认为正确地允许代码编译,但是当我尝试在将多次运行的闭包中执行相同操作时,它不会.
fn main() {
let mut v = vec![1, 2, 3, 4];
v.into_iter().fold(0, |a, b| a + b);
v = vec![1, 2, 3, 4];
vec![1, 2, 3].into_iter().for_each(|x| {
v.into_iter().fold(x, |a, b| a + b);
v = vec![1, 2, 3, 4];
});
}
error[E0507]: cannot move out of captured outer variable in an `FnMut` closure
--> src/main.rs:6:9
|
2 | let mut v = vec![1, 2, 3, 4];
| ----- captured outer variable
...
6 | v.into_iter().fold(x, |a, b| a + b);
| ^ cannot move out of captured outer variable in an `FnMut` closure
在我看来,对v 的重新分配应该满足借用检查器的要求,即在移动后不会访问任何变量。我错过了什么吗?
【问题讨论】:
-
我的猜测:
FnMut闭包可能会被多次调用。在这种情况下,for_each将按顺序执行,但如果该闭包被传递给多个线程怎么办?您可以使用v,然后其他线程尝试访问它,然后您才能重新分配给它。但这只是一个疯狂的猜测——我自己是 Rust 新手,所以我不确定。 -
@julioolvr 我也有这个想法,但我相信 rust 具有必须实现的特性。 Send 和 Sync 特征告诉 rust 类型可以在线程之间共享,而 for_each 不需要这些类型中的任何一种,因此这永远不可能。
标签: rust borrow-checker