我觉得我的实现过于繁琐,我想有更好的方法来实现这个简单的事情。
我有一个代表游戏板的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
的可变/不可变借用的错误。无论如何,我认为这个技巧可以避免使用不同的方法。
答案 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)
。