rust - 我如何在不借用 Rust 的情况下进行匹配?
问题描述
在尝试编写康威的生命游戏时,我正在与借阅检查器搏斗。我有两个 for 循环在 上做一个可变借用self.cell_states
,这是一个Vec<Vec<CellState>>
(CellState
是一个枚举),以便我可以更新每个单元格的Alive
orDead
状态。
但是,为了确定一个细胞应该是活的还是死的,它需要查看周围有多少细胞是活的。这是我遇到问题的地方。我能找到检查一个单元格是否活着的唯一方法是做一个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,
_ => ()
}
}
}
}
}
}
解决方案
我如何在不借用 Rust 的情况下进行匹配?
你不能。
每次访问变量时,都是在借用它。打印变量?那就是借钱。检查变量是否具有特定值?又借了。复制变量的值?还借。
您试图在向量被可变借用时访问向量的值。这是行不通的——借用检查器禁止这样做。
你能解决这个问题吗?是的!使用向量或数组时的常用技巧是通过迭代索引来延迟所有借用。所以写这样的东西:
for i in 0..cell_states.len() {
for j in 0..cell_states[i].len() {
...
}
}
在这种情况下,向量不会被借用,但您可以稍后通过索引它来借用它的元素。
但是:借用检查器刚刚救了你,因为你尝试的是错误的!您尝试的不是生命游戏的运作方式!您需要两个单元格网格,因为更新步骤无法即时更新所有单元格。您首先必须将所有新单元格计算为一个新向量(以便在计算新单元格时可以使用所有旧单元格值),然后可以用新向量替换旧向量。所以生命游戏中的更新步骤是一个两步过程——你不能在原地完成。
在修复了那个真正的错误之后,你会发现你不会再遇到这个特定的借用检查器问题。
推荐阅读
- firebase - firebase 索引查询实现
- python - 将样式多索引熊猫保存到excel时出现KeyError
- android - 如何使用 Android WebView 显示一个简单的三个 JS 网页?
- excel - 提示用户选择一个单元格,从该单元格获取和存储字符串
- r - dplyr:基于列计数的子集行
- android - 在 Flutter 项目的 build.gradle 中找不到 android 块
- java - 无法解析符号“列表”和 android studio 中的许多其他关键字
- woocommerce - 当产品“缺货”时,Woocommerce 将属性“Stockstatus”设置为“已售出”
- c# - 在 C# 中写入和读取文件的问题
- reactjs - 如何在保存时关闭碳模态