如何在不出现错误 "cannot borrow as mutable more than once at a time" 的情况下递增向量中的每个数字?

How to increment every number in a vector without the error "cannot borrow as mutable more than once at a time"?

此代码应该将向量中的每个值递增 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

我怎样才能完成这个任务?

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

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
}

由于 non-lexical lifetimes:

,您的代码将在 Rust 的未来版本中运行 as-is
#![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

你打电话也只是使用 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]

在我看来最简单和最易读的解决方案:

#![feature(nll)]
fn main() {
    let mut v = vec![2, 3, 1, 4, 2, 5];
    for i in 0..v.len() {
        v[i] += 1;
        println!("{}", j);
    }
    println!("{:?}", v);
}