因生锈而再次借贷的问题

问题描述 投票:-1回答:1

我最近刚从Rust开始,从事小型游戏,不幸的是,由于存在多个可变借用的错误,我在实现简单机制时遇到了问题,例如,以下代码存在第二个可变借用的问题

struct Margin {
    x: f32,
    y: f32, 
    h: f32, 
    w: f32,
}

struct Level {
    margins: Vec<Margin>,
}

impl Level {
    fn new() -> Self {
        Level{
            margins: vec![]
        }
    }

    fn update(&mut self) {
        // Add a new margin on each tick
        self.margins.push(Margin {
          x:0., y:0., w:100., h:0.5,
        });

        // Iterate over margins moving each one down a little
        for (i, m) in self.margins.iter_mut().enumerate() {
            m.y += 1.;

            // Remove margins outside of the screen
            if m.y > 640. {
                self.margins.remove(i);
            }
        }
    }
}

fn main() {
    let mut l = Level::new();
    l.update();
}

错误

   Compiling playground v0.0.1 (/playground)
error[E0499]: cannot borrow `self.margins` as mutable more than once at a time
  --> src/main.rs:31:17
   |
26 |         for (i, m) in self.margins.iter_mut().enumerate() {
   |                       -----------------------------------
   |                       |
   |                       first mutable borrow occurs here
   |                       first borrow later used here
...
31 |                 self.margins.remove(i);
   |                 ^^^^^^^^^^^^ second mutable borrow occurs here
rust
1个回答
1
投票
retain上找到了有用的方法Vec,并且代码固定如下:

struct Margin { x: f32, y: f32, h: f32, w: f32, } struct Level { margins: Vec<Margin>, } impl Level { fn new() -> Self { Level{ margins: vec![] } } fn update(&mut self) { // Add a new margin on each tick self.margins.push(Margin { x:0., y:0., h:100., w:0.5, }); // Iterate over margins moving each one down a little for m in self.margins.iter_mut() { m.y += 1.; } // Retains only the elements where y is lower than 640. self.margins.retain(|v| v.y < 640.); } } fn main() { let mut l = Level::new(); l.update(); }

根据此处的先前回答Remove an element while iterationg over it进行了回答>>        
© www.soinside.com 2019 - 2024. All rights reserved.