我有一个包含二维数组的结构:
struct Block;
struct World {
blocks: [[Block; 10]; 10],
}
如何编写一个函数,该函数返回二维数组上的迭代器,但包含枚举索引?
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)
上的迭代器?
我知道我可以让函数返回一个自定义结构,然后实现 Iterator
,就像 image
那样,但理想情况下我想避免这种情况。
最佳答案
If I call
Iterator::enumerate
once, I will get an iterator over(usize, [B; 10])
s. What I can do next to get an iterator over(usize, usize, B)
s?
调用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
关于iterator - 如何返回包含枚举索引的二维数组的迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52339851/