我正在尝试创建一个简单的程序,其中包含一个逐渐清空自己的集合的闭包:
fn main() {
let vector = vec![1, 2, 3];
let mut allow_once = move |i: &i32| -> bool {
if let Some(index) = vector.position_elem(i) {
vector.remove(index);
return true
}
false
};
for e in &[1, 2, 3, 1, 2, 3] {
let is_in = if allow_once(e) { "is" } else { "is not" };
println!("{} {} allowed", e, is_in);
}
}
Run Code Online (Sandbox Code Playgroud)
它似乎是犹太人(对我而言),但是rustc抱怨(每晚):
<anon>:6:13: 6:19 error: cannot borrow captured outer variable in an `FnMut` closure as mutable
<anon>:6 vector.remove(index);
^~~~~~
Run Code Online (Sandbox Code Playgroud)
我希望这个问题可能是一个令人沮丧的问题.也就是说,虽然实现从未违反别名XOR Mutation原则,但可能是这样rustc做是没有意识到的.
从而:
注意:通过引用捕获不是一个选项,我希望能够移动闭包.
事实上,这个问题很容易解决.只需添加mut限定符即可vector:
fn main() {
let mut vector = vec![1, 2, 3];
let mut allow_once = move |i: &i32| -> bool {
if let Some(index) = vector.position_elem(i) {
vector.remove(index);
true
} else { false }
};
for e in &[1, 2, 3, 1, 2, 3] {
let is_in = if allow_once(e) { "is" } else { "is not" };
println!("{} {} allowed", e, is_in);
}
}
Run Code Online (Sandbox Code Playgroud)
(这里的工作代码)
这与变通规则一样 - 为了改变某些东西,它必须在mut某个地方,无论是在变量声明中还是在它的类型(&mut)中.