Rust遍历借用的可变引用

qv7cva1a  于 2022-11-12  发布在  其他
关注(0)|答案(2)|浏览(177)

我想要一个函数来控制和改变rust中的向量。下面是一个简化的版本:

fn foo(vec: &mut Vec<i32>) {
    for (i, element) in vec.iter().enumerate() {
        // Some checks here
        vec[(*element) as usize] = i as i32;
    }
}

fn main() {
    let mut bar: Vec<i32> = vec![1, 0, 2];
    foo(&mut bar);
}

这段代码无法编译,因为在foo中同时存在不可变和可变的vec借位。我试图通过将vec复制到一个单独的副本来解决这个问题,但这不起作用,而且也不会很漂亮。正确的方法是什么?

j8yoct9x

j8yoct9x1#

如果你想改变Vec,正确的方法是 mutably 而不是immutably迭代:

fn foo(vec: &mut Vec<i32>) {
    // note the `iter_mut` here:
    for element in vec.iter_mut() {
        // Some checks here
        // element now has type `&mut i32` and we can mutate it directly.
        *element *= 2;
    }
}

fn main() {
    let mut bar: Vec<i32> = vec![1, 2, 3];
    foo(&mut bar);
    println!("{:?}", bar); // [2, 4, 6]
}
fxnxkyjh

fxnxkyjh2#

通过使用如下索引访问,可以避免借用整个Vec

fn foo(vec: &mut Vec<i32>) {
    for index in 0..vec.len() {
        let element = vec[index];
        if element <= 0 {
            continue;
        }
        vec[index] = index as i32;
    }
}

fn main() {
    let mut bar: Vec<i32> = vec![1, 0, 2];
    foo(&mut bar);
    println!("{:?}", bar)
}

相关问题