如何在迭代过程中改变向量元素?

时间:2018-03-29 04:06:09

标签: rust

我正在迭代一个向量,我想改变其中一个元素。

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

    for (i, el) in vector.iter().enumerate() {
        if i == 0 {
            continue;
        }
        vector[i - 1] += el
    }
}

这给了我编译错误:

error[E0502]: cannot borrow `vector` as mutable because it is also borrowed as immutable
 --> src/main.rs:8:9
  |
4 |     for (i, el) in vector.iter().enumerate() {
  |                    ------ immutable borrow occurs here
...
8 |         vector[i - 1] += el
  |         ^^^^^^ mutable borrow occurs here
9 |     }
  |     - immutable borrow ends here

我理解为什么会出现这种错误。我在枚举范围的生命周期中借用向量作为不可变的,然后尝试改变该范围内的内部,从而打破借用规则。我只是不明白如何正确地做到这一点。我想我需要为枚举提供可变的借用?

我尝试了mut&mut的各种组合,我遇到了不同的编译错误。我知道我可以将它变为Vec<Cell<i32>>并以这种方式改变内容,但对于这样一个简单的例子来说这似乎有些过分了。

1 个答案:

答案 0 :(得分:2)

使用索引。

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

    for i in 1..vector.len() {
        vector[i - 1] += vector[i];
    }

    println!("{:?}", vector);
}