如何在没有错误的情况下递增向量中的每个数字"不能一次多次借用可变的"?

时间:2018-03-15 13:04:51

标签: vector rust borrow-checker

此代码应该将向量中的每个值递增1:

fn main() {
    let mut v = vec![2, 3, 1, 4, 2, 5];
    let i = v.iter_mut();
    for j in i {
        *j += 1;
        println!("{}", j);
    }
    println!("{:?}", &mut v);
}

由于Rust的借用规则,它无法正常工作:

error[E0499]: cannot borrow `v` as mutable more than once at a time
 --> src/main.rs:8:27
  |
3 |     let i = v.iter_mut();
  |             - first mutable borrow occurs here
...
8 |     println!("{:?}", &mut v);
  |                           ^ second mutable borrow occurs here
9 | }
  | - first borrow ends here

我该如何完成这项任务?

3 个答案:

答案 0 :(得分:6)

不要存储可变迭代器;直接在循环中使用它:

fn main() {
    let mut v = vec![2, 3, 1, 4, 2, 5];

    for j in v.iter_mut() { // or for j in &mut v
        *j += 1;
        println!("{}", j);
    }

    println!("{:?}", &v); // note that I dropped mut here; it's not needed
}

答案 1 :(得分:3)

由于非词汇生存期,您的代码将在Rust的未来版本中按原样运行:

#![feature(nll)]

fn main() {
    let mut v = vec![2, 3, 1, 4, 2, 5];
    let i = v.iter_mut();
    for j in i {
        *j += 1;
        println!("{}", j);
    }
    println!("{:?}", &mut v);
}

playground

答案 2 :(得分:0)

您也可以像这样使用mapcollect来呼叫,

>> let mut v = vec![5,1,4,2,3];
>> v.iter_mut().map(|x| *x += 1).collect::<Vec<_>>();
>> v
[6, 2, 5, 3, 4]