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_inself.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 に答える