【问题标题】:How do I return an iterator over a 2D array with the enumeration indices included?如何在包含枚举索引的二维数组上返回迭代器?
【发布时间】:2018-09-14 22:19:23
【问题描述】:

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

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])s 上获得一个迭代器。接下来我可以做什么来获得(usize, usize, B)s 上的迭代器?

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

【问题讨论】:

  • 这似乎相当低的努力...searching the Rust docs for enumerate 指向Iterator::enumerate,这似乎是您所要求的大约 95%。假设您进行了这项研究,您在尝试使用它时遇到了什么问题?
  • 问题是我想枚举一个二维数组[[B; 10]; 10]。或者更确切地说,返回一个可以迭代二维数组的迭代器。如果我调用 enumerate 一次,我将在 (usize, [B; 10])s 上获得一个迭代器。我的问题是接下来我可以做些什么来获得(usize, usize, B)s 上的迭代器。

标签: iterator rust


【解决方案1】:

如果我调用Iterator::enumerate 一次,我将获得(usize, [B; 10])s 上的迭代器。接下来我可以做些什么来获得(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

【讨论】:

  • 太好了,谢谢。这对我来说非常有效。你能解释一下为什么需要move吗?
  • @JamesHinshelwood 没有它,编译器假定您想在元组中放置对 x 的引用,而不是复制值。
猜你喜欢
  • 2014-06-27
  • 1970-01-01
  • 2021-11-26
  • 2019-12-24
  • 1970-01-01
  • 2011-04-25
  • 2015-01-29
  • 2021-05-08
  • 2016-07-07
相关资源
最近更新 更多