现在我正在用Rust为WebAssembly编写tutorial。任务是在Rust中实现Conways Game of Life。编写像Rust这样的低级语言对我来说是一个新事物,但凭借我以前的编码经验,我理解了大部分语法。
我遇到的问题是关于这个函数的逻辑:
fn live_neighbor_count(&self, row: u32, column: u32) -> u8 {
let mut count = 0;
for delta_row in [self.height - 1, 0, 1].iter().cloned() {
for delta_col in [self.width - 1, 0, 1].iter().cloned() {
if delta_row == 0 && delta_col == 0 {
continue;
}
let neighbor_row = (row + delta_row) % self.height;
let neighbor_col = (column + delta_col) % self.width;
let idx = self.get_index(neighbor_row, neighbor_col);
count += self.cells[idx] as u8;
}
}
count
}
在Conways Game of Life的这个实现中,单元格的网格被表示为一维数组。这个函数的任务现在是获取坐标(row
和column
)并在这个坐标的邻居周围迭代。因为数组只是一维的,所以任务需要delta_row
和delta_col
,它们在数组上迭代以计算邻居。
现在我的问题是理解为什么选择[self.height - 1, 0, 1]
和[self.height - 1, 0, 1]
数组进行迭代。
我已经试着把迭代值打印出来,并在纸上画出网格来形象化这个过程,现在我还试着实现一个自己编写的函数,以便更好地理解上面函数的选择。
也许你已经解决了这个或类似的问题,可以给予我一个提示是怎么回事。
谢谢你的阅读,祝你周末愉快!
2条答案
按热度按时间tvokkenx1#
由于无符号整数(
u32
)的约束,它看起来有点奇怪。它给出了原始值1以内的每一行,但是我们不能使用
-1
,因为它有符号。所以我们实际上是在整数模
self.height
中工作,在这里是-1 = self.height - 1
,所以我们可以自由地替换后者(对于u32
是法律的的)。一个简单的方法就是在后面替换它,在
delta_row = self.height - 1
的迭代中,我们做了其是
row
之前的行(在边缘处具有回绕)。lb3vh1jj2#
输入:
| self.height| self.width|行|管柱|
| - ------| - ------| - ------| - ------|
| 六十四|六十四|四个|六个|
最初,delta_row创建一个数组,该数组将包含[64 - 1 = 63,0,1],并且它将在每次迭代中将delta_row替换为一个值,因此迭代将如下所示:
| 增量行|增量列|相邻行|内博尔科尔|idx公司|
| - ------| - ------| - ------| - ------| - ------|
| 六十三|六十三|4 + 63% 64 = 3| 6 + 63% 64 = 5|获取索引(3,5)|
| 六十三|无|三个|六个|获取索引(3,6)|
| 六十三|1个|三个|七|获取索引(3,7)|
| 无|六十三|四个|五个|获取索引(4,5)|
| 无|无|续|续|续|
| 无|1个|四个|七|获取索引(4,7)|
| 1个|六十三|五个|五个|获取索引(5,5)|
| 1个|无|五个|六个|获取索引(5,6)|
| 1个|1个|五个|七|获取索引(5,7)|
看看它是怎么在你的行和列周围画出一个空心的正方形的,计数是由self.cells [idx]增加的,self.cells [idx]总是0或者1,由枚举定义,所以那些活着的会增加计数。