gpt4 book ai didi

rust - 如何在不借用 Rust 的情况下进行匹配?

转载 作者:行者123 更新时间:2023-11-29 07:57:59 24 4
gpt4 key购买 nike

我在尝试编写 Conway 的 Game of Life 时正在与借用检查器搏斗。我有两个 for 循环在 self.cell_states 上进行可变借用,这是一个 Vec<Vec<CellState>> (CellState 是一个枚举)这样我就可以更新 AliveDead每个细胞的状态。

为了决定一个细胞是活的还是死的,它需要查看周围有多少细胞是活的。这是我遇到问题的地方。我能找到的检查细胞是否存活的唯一方法是执行 match。声明,但显然 match借用值(value),这是不允许的,因为我已经完成了可变借用。在我看来,我可以只复制该值并检查复制的值,所以我尝试了 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,
_ => ()
}
}
}
}
}
}

最佳答案

How can I match without borrowing in Rust?

你不能。

每次访问一个变量,都是在借用它。打印变量?那就是借钱。检查变量是否具有特定值?又要借了复制变量的值?也是借。

当向量被可变地借用时,您正试图访问向量的值。这根本行不通——借用检查器禁止这样做。

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

for i in 0..cell_states.len() {
for j in 0..cell_states[i].len() {
...
}
}

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

但是:借用检查器刚刚救了你,因为你尝试的是错误的!你尝试的不是 Game of Life 的运作方式!您需要两个 单元格网格,因为更新步骤无法即时更新所有单元格。您首先必须将所有新单元格计算到一个新向量中(以便您可以在计算新单元格值时使用所有旧单元格值),然后您可以用新向量替换旧向量。所以 Game of Life 中的更新步骤是一个两步过程——您不能就地完成。

在修复了那个真正的错误之后,你会发现你不会再遇到这个特定的借用检查器问题。

关于rust - 如何在不借用 Rust 的情况下进行匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54376760/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com