如何在不借入Rust的情况下进行匹配?

Mic*_*rst 3 rust

在尝试编写Conway的《人生游戏》时,我正在与借阅检查器进行搏斗。我有两个for循环,对进行可变借用self.cell_states,这是一个Vec<Vec<CellState>>CellState是一个枚举),以便可以更新每个单元格的AliveDead状态。

为了确定一个细胞是应该存活还是死亡,它需要查看周围有多少个细胞存活。这是我遇到问题的地方。我可以检查单元格是否存在的唯一方法是执行一条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
Run Code Online (Sandbox Code Playgroud)

我的代码如下(Playground):

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
Run Code Online (Sandbox Code Playgroud)

Luk*_*odt 5

如何在不借入Rust的情况下进行匹配?

你不能

每次访问变量时,都是在借用它。打印变量?那是借钱。检查变量是否具有特定值?再次借用。复制变量的值?还借钱。

您正在尝试可变地借用向量时访问向量的值。这只是行不通-借阅检查器禁止这样做。

您可以解决这个问题吗?是! 使用向量或数组时,通常的技巧是通过遍历索引来延迟所有借用。所以写这样的东西:

for i in 0..cell_states.len() {
    for j in 0..cell_states[i].len() {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,不会借用向量,但是您以后可以通过索引它来借用向量的元素。

但是:借阅检查器只是保存了您,因为您尝试的是越野车!您尝试的不是生活游戏的运作方式!您需要两个单元格网格,因为更新步骤无法动态更新所有单元格。首先,您必须将所有新单元格计算为一个新向量(以便您可以在计算新值时使用所有旧单元格值),然后可以用新值替换旧向量。因此,“人生游戏”中的更新步骤分为两个步骤-您不能就地完成。

并且,在修复了该实际错误之后,您将发现您不会再遇到此特定的借用检查器问题。

  • @MichaelDorst 不要难过!这是一个如此经典的错误:它可能在某一时刻至少发生在每个人身上。继续你的 Rust 之旅,玩得开心! (2认同)