我正在努力寻找(usize, usize)
x N
矩阵中给定位置(即M
)的所有直接邻居。
矩阵提供方法get(p: Position) -> Option<T>
,在该方法中进行边界检查,如果位置超出范围,则返回None
。这意味着不需要检查上限,但是仍然需要检查下限。也就是说,它不会在任何方向下溢出0
。
我的第一个尝试是遍历切片&[-1, 0, 1]
并使用checked_add
,但这是行不通的,因为-1
不是usize
。
我的下一个尝试是从我的位置(x
和y
中减去1,然后在切片&[0, 1, 2]
上进行迭代,但这对位置{{1}无效) }或(0, _)
。
我准备了playground,其中一个人可以实现一个功能。 (我希望我的测试是正确的)
(_, 0)
({type Position = (usize, usize) //x, y
fn get_neighbours(p: Position) -> impl Iterator<Item = Position> {
unimplemented!()
}
可以替换为impl Iterator
)。
答案 0 :(得分:2)
You just need to use if
expressions to handle the special case that the coordinates are zero, e.g.
fn get_neighbours(p: Position) -> impl Iterator<Item = Position> {
let m_range = if p.0 > 0 { p.0 - 1..p.0 + 2 } else { 0..2 };
let n_range = if p.1 > 0 { p.1 - 1..p.1 + 2 } else { 0..2 };
m_range
.flat_map(move |m| n_range.clone().map(move |n| (m, n)))
.filter(move |&q| p != q)
}