Я борюсь с заемщиком, пытаясь написать «Игру жизни» Конвея. У меня есть два цикла for, выполняющих изменчивое заимствование для self.cell_states
, то есть Vec<Vec<CellState>>
(CellState
- это перечисление), чтобы я мог обновить статус Alive
или Dead
каждой ячейки.
Чтобы решить, должна ли клетка быть живой или мертвой, необходимо увидеть, сколько из окружающих клеток живы. Здесь я столкнулся с проблемами. Единственный способ проверить, жива ли ячейка, - это сделать оператор match
, но, очевидно, match
заимствует значение, что недопустимо, поскольку я уже сделал изменяемый заем. Мне кажется, что я мог просто скопировать значение и проверить скопированное значение, поэтому я попытался match self.cell_states[i+x-1][j+y-1].clone() {...}
, но безрезультатно. Как я могу сделать матч без заимствования?
error[E0502]: cannot borrow `cell_states` as immutable because it is also borrowed as mutable
--> src/main.rs:18:27
|
11 | for (i, row) in cell_states.iter_mut().enumerate() {
| ----------------------------------
| |
| mutable borrow occurs here
| mutable borrow used here, in later iteration of loop
...
18 | match cell_states[i+x-1][j+y-1] {
| ^^^^^^^^^^^ immutable borrow occurs here
Мой код выглядит следующим образом ( Детская площадка ):
#[derive(Copy, Clone)]
pub enum CellState {
Dead,
Alive
}
fn main() {
let mut cell_states = vec![vec![CellState::Dead; 10]; 10];
for (i, row) in cell_states.iter_mut().enumerate() {
for (j, cell) in row.iter_mut().enumerate() {
// Count the living cells around cell
let mut count = 0;
for x in 0..3 {
for y in 0..3 {
match cell_states[i+x-1][j+y-1] {
CellState::Alive => count += 1,
_ => ()
}
}
}
}
}
}