实现 Iterator 特性的嵌套结构中的 Item 是什么?

What is the Item in a nested struct that implements the Iterator trait?

我正在观看 a video on Rust iterators 并且视频主机实现了一个稍微复杂的结构 Flatten。从本质上讲,这个 Flatten 结构保存了项目,每个项目都实现了 IntoIterator 特性,因此 Flatten 中的每个项目( 注意下面的代码不是最终代码来自视频,仅用于展示我的困惑):

pub struct Flatten<O>
{
    outer: O,
}

impl<O> Flatten<O> {
    fn new(iter: O) -> Self {
        Flatten { outer: iter }
    }
}

然后是 Flatten 实现 Iterator 特征的部分:

impl<O> Iterator for Flatten<O>
where
    O: Iterator,
    O::Item: IntoIterator,
{
    type Item = <O::Item as IntoIterator>::Item;
    fn next(&mut self) -> Option<Self::Item> {
        self.outer.next().and_then(|inner| inner.into_iter().next())
    }
}

我很困惑的是,当我们设置约束O::Item: IntoIterator时,我们显然意味着泛型O具有实现IntoIterator的项。

编辑 1: 澄清一下,我的困惑是我们先说了 O::Item: IntoIterator 然后又指定了 type Item = <O::Item as IntoIterator>::Item。这两个子句中出现的 Item 指的是不同的概念吗?

编辑 2: 我想我现在明白了。 IteratorItem,所以我们可以写 O::Item: IntoIterator。当我们定义 type Item = <O::Item as IntoIterator>::Item 时,我们为 Flatten 而不是 O 指定了 return 项目类型。我被语法搞糊涂了,有些不合逻辑的理解。

Rust 知道要选择什么项目,因为我们明确告诉他要选择什么 Item。 我们知道 IteratorIntoIterator 都定义了一个 Item.

所以 Flatten 是其他 IntoIterator (O) 的集合,作为访问此 IntoIterator 内部项目的目标,我们需要将 Flatten::Item 设置为与内部 IntoIterator::Item 相同,因此:

type Item = <O::Item as IntoIterator>::Item;

由于我们正在实施 Iterator,因此 Self::Item 是实施定义的项目(我们刚刚解释过的内部项目)。

回顾一下:

  • O::Item => 内部 IntoIterator::Item 用于展平
  • Self::Item => 展平为迭代器 Item。与上一个匹配。
  • Flatten::Item => 与 Iterator 实施的 Self::Item 相同。