我有一个 “Board”(即“&mut Vec>”)需要在迭代时更新。我希望用函数生成的新值来更新它,这个函数需要一个 “&Vec>” 作为其参数。
我尝试了几种方法:
1. 使用 “board.iter_mut().enumerate()” 和 “row.iter_mut().enumerate()”,以便我可以在最内部的循环中更新 “cell”。但是 Rust 不允许调用 “next_gen” 函数,因为它需要一个 “&Vec>”,而当你已经拥有一个可变引用时就不能再有不可变引用了。 2. 修改 “next_gen” 函数签名以接受一个 “&mut Vec>”。但是 Rust 不允许对一个对象进行多个可变引用。
我目前将所有的更新推迟到一个 “HashMap” 中,然后在执行迭代后应用它们:
我尝试了几种方法:
1. 使用 “board.iter_mut().enumerate()” 和 “row.iter_mut().enumerate()”,以便我可以在最内部的循环中更新 “cell”。但是 Rust 不允许调用 “next_gen” 函数,因为它需要一个 “&Vec>”,而当你已经拥有一个可变引用时就不能再有不可变引用了。 2. 修改 “next_gen” 函数签名以接受一个 “&mut Vec>”。但是 Rust 不允许对一个对象进行多个可变引用。
我目前将所有的更新推迟到一个 “HashMap” 中,然后在执行迭代后应用它们:
fn step(board: &mut Board) {
let mut cells_to_update: HashMap<(usize, usize), Cell> = HashMap::new();
for (row_index, row) in board.iter().enumerate() {
for (column_index, cell) in row.iter().enumerate() {
let cell_next = next_gen((row_index, column_index), &board);
if *cell != cell_next {
cells_to_update.insert((row_index, column_index), cell_next);
}
}
}
println!("To Update: {:?}", cells_to_update);
for ((row_index, column_index), cell) in cells_to_update {
board[row_index][column_index] = cell;
}
}
是否有一种方法可以使这段代码在最内层循环中“原地”更新board
,同时仍然能够在最内层循环中调用next_gen
?
免责声明:
我正在学习Rust,并且我知道这不是最好的做法。我在尝试了解我能够做什么和不能做什么。我还试图限制任何复制以稍微限制自己。正如oli_obk - ker提到的那样,这个康威生命游戏的实现是有缺陷的。
这段代码旨在评估以下几点:
- 这是否可行
- 它是否符合惯用的Rust风格
从评论中我所了解的是,使用std::cell::Cell
是可能的。然而,使用std:cell:Cell
绕过了一些核心的Rust原则,这也是我在原问题中描述的“困境”。
&mut
引用的位置。可以将其类比于 C++ 类成员上的mutable
关键字。您的非可变对象突然被允许进行修改。 - oli_obk