iterator - 如何返回包含枚举索引的二维数组的迭代器?

标签 iterator rust

我有一个包含二维数组的结构:

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/

相关文章:

C++ "iter =++iter"是做什么的?有效吗?

c++ - 正确取消对指针的引用迭代器

python - 是否有一种 pythonic 方法来迭代范围字典以构建新字典?

vector - 向量上的 Rust 模式匹配

rust - 通过 if 语句绑定(bind)的变量无法正常工作

c++ - 对于 BTreeMap 和其他依赖 Ord 的事物,是否有等效于 C++ 比较器对象的对象?

ruby - 参数数量错误(至少 1 个)

c++ - 使自定义容器可迭代

rust - 有没有办法制作包含自身矢量的特征?

rust - 无法推断 `U` 的类型