如何在迭代时改变向量的元素?

Mat*_*son 3 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
    }
}
Run Code Online (Sandbox Code Playgroud)

这给了我编译器错误:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

DK.*_*DK. 6

使用索引。

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

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

    println!("{:?}", vector);
}
Run Code Online (Sandbox Code Playgroud)

  • @BHustus:他们*不能*。迭代器不能要求您在生成下一个之前删除一个项目。对单个项目的可变引用很好,因为您只能为每个元素获得 *一个*。 (2认同)
  • 从更具建设性的角度来看,比“if i == 0 { continue }”更惯用的做法是简单地从“1”开始:“for i in 1..vector.len()”,除非有更多“if”块中必需的操作。这也适用于问题中提供的原始示例。 (2认同)