0

我觉得我的实现太麻烦了,我想有更好的方法来实现这个简单的东西。

我有一个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. 无论如何,我认为这个技巧可以避免使用不同的方法。

4

1 回答 1

5

您应该阅读并记住Iteratortrait的方法。具体来说,你想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).

于 2015-09-13T20:47:53.410 回答