使用相同的方法在向量中查找并推送元素

时间:2015-09-13 20:40:27

标签: vector rust borrow-checker

我觉得我的实现过于繁琐,我想有更好的方法来实现这个简单的事情。

我有一个代表游戏板的Grid结构,我有一个方法可以将一个单元添加到网格中,这个方法(add_cell)检查网格中是否已经存在一个单元格,然后添加它

struct Cell {
    // A simplified version with only one coordinate
    position: i8,
}

struct Grid {
    // List of cells in the grid
    cells: Vec<Rc<Cell>>,
}

impl Grid {
    // Add a cell in to the grid
    pub fn add_cell(&mut self, cell: Cell) {
        let is_not_yet_in;
        {
            if self.cells.iter().find(|&c| c.position == cell.position).is_some() {
                is_not_yet_in = false;
            } else {
                is_not_yet_in = true;
            }
        }
        if is_not_yet_in {
            self.cells.push(Rc::new(cell).clone());
        }
    }
}

我在is_not_yet_in声明之后放置范围,以避免编译self.cells的可变/不可变借用的错误。无论如何,我认为这个技巧可以避免使用不同的方法。

1 个答案:

答案 0 :(得分:5)

您应该阅读并承诺记忆Iterator trait的方法。具体来说,您需要any。我还在您的变量名称上翻转了极性以匹配。

pub fn add_cell(&mut self, cell: Cell) {
    let is_present = self.cells.iter().any(|c| c.position == cell.position);
    if !is_present {
        self.cells.push(Rc::new(cell).clone());
    }
}

此外,Rc::new(cell).clone()没有任何意义 - 您也可以将其缩短为Rc::new(cell)