我正在尝试编写康威生命游戏时,遇到了借用检查器的问题。我有两个for循环对self.cell_states进行可变借用,它是一个Vec>(CellState是一个枚举类型),以便我可以更新每个单元格的Alive或Dead状态。
然而,为了确定单元格应该是活着还是死了,它需要看看周围有多少细胞是活着的。这就是我遇到问题的地方。我能找到的唯一检查单元格是否存活的方法是使用match语句,但显然match会借用该值,这是不允许的,因为我已经进行了可变借用。在我看来,我只需复制该值并根据复制的值进行检查,因此我尝试了match self.cell_states[i+x-1][j+y-1].clone() {...},但无济于事。如何进行匹配而无需借用?
我的代码如下(Playground):
然而,为了确定单元格应该是活着还是死了,它需要看看周围有多少细胞是活着的。这就是我遇到问题的地方。我能找到的唯一检查单元格是否存活的方法是使用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
我的代码如下(Playground):
#[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,
_ => ()
}
}
}
}
}
}