【发布时间】:2015-05-05 13:03:28
【问题描述】:
我正在尝试创建一个简单的程序,其中包含一个逐渐清空自身的集合的闭包:
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);
}
}
这似乎是犹太洁食(对我而言),但 rustc 抱怨(每晚):
<anon>:6:13: 6:19 error: cannot borrow captured outer variable in an `FnMut` closure as mutable
<anon>:6 vector.remove(index);
^~~~~~
我预计问题可能是脱糖问题之一。也就是说,虽然实现从不违反 Aliasing XOR Mutation 原则,但可能是去保证让rustc 没有意识到这一点。
因此:
- 这是暂时的限制/错误还是固有的?
- 如何尽可能高效地创建具有可变环境的闭包?
注意:通过引用捕获不是一个选项,我希望能够移动闭包。
【问题讨论】:
-
约定是
vec![1, 2, 3]优于vec!(1, 2, 3),顺便说一句。 -
@ChrisMorgan:已编辑 :)