如何使用共享捕获变量的多个闭包编译Rust 0.10?

如何使用共享捕获变量的多个闭包编译Rust 0.10?,rust,Rust,自从今天升级到Rust 0.10后,我发现此代码不再有效: let mut outer_value = 0; let add = |x| { outer_value += x; }; let multiply = |x| { outer_value *= x; }; //Showing commented code to demonstrate intent //add(4); //multiply(6); //println!("{:d}", outer_value);

自从今天升级到Rust 0.10后,我发现此代码不再有效:

let mut outer_value = 0;

let add = |x| {
    outer_value += x;
};

let multiply = |x| {
    outer_value *= x;
};

//Showing commented code to demonstrate intent
//add(4);
//multiply(6);
//println!("{:d}", outer_value);
这给了我以下编译器错误:

closures.rs:13:20: 15:6 error: cannot borrow `outer_value` as mutable more than once at a time
closures.rs:13     let multiply = |x| {
closures.rs:14         outer_value *= x;
closures.rs:15     };
closures.rs:14:9: 14:20 note: borrow occurs due to use of `outer_value` in closure
closures.rs:14         outer_value *= x;
                       ^~~~~~~~~~~
closures.rs:9:15: 11:6 note: previous borrow of `outer_value` occurs here due to use in closure; the mutable borrow prevents subsequent moves, borrows, or modification of `outer_value` until the borrow ends
closures.rs:9     let add = |x| {
closures.rs:10         outer_value += x;
closures.rs:11     };
closures.rs:22:2: 22:2 note: previous borrow ends here
closures.rs:6 fn main() {
...
closures.rs:22 }
               ^
error: aborting due to previous error
这在锈蚀0.9时起作用。还有什么办法可以让它以某种方式发挥作用吗


注意:我认为夜间版本和0.10版本今天(4月3日)是一个相同的版本,但我已经用这两个版本进行了测试。同样的结果。

在锈0.9中起作用?我想这是本周期修补的不健康缺陷之一

该代码确实需要多个可变借用,因此0.9行为是不正确的;0.10的行为是正确的

您可以做两件事:

  • 重构您的代码,使其不必满足此要求,或者
  • 使用
    RefCell
    而不是
    T
    ,以使用运行时借用检查
  • 使用
    Cell
    而不是
    T
    ,维护对象的本地副本,而不是进行借用

在锈蚀0.9的情况下工作?我想这是本周期修补的不健康缺陷之一。该代码确实需要多个可变借用,因此0.9行为是不正确的;0.10的行为是正确的。你能重构你的代码,这样就不需要这个需求了吗?如果不能,则需要使用
Rc
而不是
t
,以使用运行时借用检查。啊,谢谢!是的,这只是我正在做的一个简单的闭包演示的一部分;所以我可以把外部的_值分成两个独立的值。这样的例子会有点难看,但至少它会更好地符合生锈安全问题的真正精神。对于简单类型(如本例中的原语),一个
单元格也会起作用:
let outer=Cell::new(0);/*…*/outer.set(outer.get()+x)
。这样做的好处是不会像
RefCell
那样出现任何动态借用失败,而且通常效率更高。此外,值得注意的是
RefCell
Cell
(以及任何其他值)都是通过引用捕获的,即一个闭包中的更改将在其他闭包(和外部)中看到,因此,
Rc
实际上是不必要的。哦,是的,忘记了因为它们的内部可变性,它们不需要外部可变性,所以它们不是唯一的借用。又变了!