rust 无法在循环内借用可变值

rbl8hiat  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(196)

我正在尝试从数组中删除一个元素:

pub fn update(arr: &mut Vec<Pipe>) {
        // move pipes
        for pipe in arr.iter_mut() { //first mutable borrow occurs here
            pipe.pos.x -= 2.;

            if pipe.pos.x < 20. {
                arr.remove(0); //seconds mutable borrow
            }
        }
    }

错误:

cannot borrow `*arr` as mutable more than once at a time
second mutable borrow occurs here
piok6c0g

piok6c0g1#

处理新创建的阵列副本。
为此,Pipe类型必须是可克隆的:

pub fn update(arr: &mut Vec<Pipe>) {
    *arr = arr.into_iter()
    .map(|mut p| {p.pos.x -= 2.0; (*p).clone()})
    .filter(|p| p.pos.x >= 20.0)
    .collect();
}

使用user1937198 hint,你可以执行以下两步解决方案--首先丢弃少于20个管道,然后进行迭代:

pub fn update(arr: &mut Vec<Pipe>) {
    arr.retain(|p| p.pos.x >= 22.0);
    for pipe in arr.iter_mut() {
        pipe.pos.x -= 2.0;
    }
}

两种解决方案都假定必须删除当前测试的Pipe,而不是第一个。

相关问题