繁体   English   中英

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

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

我正在观看关于 Rust 迭代器的视频,视频主机实现了一个稍微复杂的 struct Flatten 本质上,这个Flatten结构包含项目,每个项目都实现了IntoIterator特性,以便Flatten中的每个项目(请注意,以下代码不是视频中的最终代码,仅用于显示我的困惑):

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

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

然后是Flatten实现Iterator trait 的部分:

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定义type Item = <O::Item as IntoIterator>::Item ,我们指定的是Flatten的返回 Item 类型,而不是O 我被语法弄糊涂了,有一些不合逻辑的理解。

Rust 知道要选择什么项目,因为我们特别告诉他要选择什么Item 我们知道IteratorIntoIterator定义了一个Item

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

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

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

回顾一下:

  • O::Item => Inner IntoIterator::Item用于展平
  • Self::Item => Flatten as Iterator Item 与上一个匹配。
  • Flatten::Item => 与Iterator实现的Self::Item相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM