如何在包含枚举索引的 2D 数组上返回迭代器?



我有一个包含 2D 数组的结构:

struct Block;
struct World {
blocks: [[Block; 10]; 10],
}

如何编写一个在 2D 数组上返回迭代器的函数,但包含枚举索引?

fn enumerate_blocks(&self) -> impl Iterator<Item = (usize, usize, &Block)>

我设法编写了一个函数的实现,它只返回一个没有枚举索引的迭代器:

fn blocks(&self) -> impl Iterator<Item = &Block> {
self.blocks.iter().flat_map(|x| x.iter())
}

如果我调用Iterator::enumerate一次,我将在(usize, [B; 10])秒内得到一个迭代器。接下来我能做什么来让迭代器超过(usize, usize, B)秒?

我知道我可以让函数返回一个自定义结构,然后像image一样实现Iterator,但理想情况下我想避免这种情况。

如果我调用Iterator::enumerate一次,我将得到一个超过(usize, [B; 10])秒的迭代器。接下来我能做什么来让迭代器超过(usize, usize, B)秒?

以相同的方式在内部数组上调用Iterator::enumerate,继续使用Iterator::flat_map将它们组合在一起。使用Iterator::map将外部索引添加到内部元组。

#[derive(Debug, Default)]
struct Block;
#[derive(Debug, Default)]
struct World {
blocks: [[Block; 2]; 3],
}
impl World {
fn blocks(&self) -> impl Iterator<Item = (usize, usize, &Block)> {
self.blocks
.iter()
.enumerate()
.flat_map(|(x, v)| v.iter().enumerate().map(move |(y, v)| (x, y, v)))
}
}
fn main() {
let w = World::default();
for (x, y, v) in w.blocks() {
println!("{}, {}, {:?}", x, y, v)
}
}
0, 0, Block
0, 1, Block
1, 0, Block
1, 1, Block
2, 0, Block
2, 1, Block

相关内容

  • 没有找到相关文章

最新更新