繁体   English   中英

rust 中的第二次借用问题

[英]Issues with a second borrow in rust

我最近从 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

Vec上找到有用的方法retain ,代码固定如下:

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();
}

根据之前的答案回答这里删除一个元素,同时迭代它

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM