Rust 实现迭代器特性的嵌套结构中的项是什么?

Rust 实现迭代器特性的嵌套结构中的项是什么?,rust,iterator,nested-lists,Rust,Iterator,Nested Lists,我正在观看,视频主机实现了稍微复杂一点的结构flant。本质上,这个展平结构包含项目,每个项目都实现了到迭代器特性,因此展平中的每个项目(请注意,以下代码不是视频中的最终代码,仅用于显示我的困惑): pub结构展平 { 外:O, } impl展平{ fn新(iter:O)->自{ 展平{outer:iter} } } 然后是flant实现迭代器的部分特征: 用于展平的impl迭代器 哪里 O:迭代器, O::Item:into迭代器, { 类型Item=::Item; fn下一步(&mut s

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

pub结构展平
{
外:O,
}
impl展平{
fn新(iter:O)->自{
展平{outer:iter}
}
}
然后是
flant
实现
迭代器的部分
特征:

用于展平的impl迭代器 哪里 O:迭代器, O::Item:into迭代器, { 类型Item=::Item; fn下一步(&mut self)->选项{ self.outer.next()和| then(| inner | inner.into_iter().next()) } } 我非常困惑的是,当我们设置约束
O::Item:IntoIterator
时,我们显然意味着泛型类型
O
具有实现
IntoIterator
的项

编辑1:为了澄清,我的困惑是我们首先说
O::Item:IntoIterator
,然后再次指定
type Item=::Item
。这两个子句中出现的
项是否涉及不同的概念


编辑2:我想我现在明白了。
Iterator
具有
Item
,因此我们可以将
O::Item:intoierator
。当我们定义
type Item=::Item
时,我们是为
Flatten
指定返回项类型,而不是为
O
指定返回项类型。我被语法弄糊涂了,有些不合逻辑的理解。

Rust知道选择什么项目,因为我们特别告诉他选择什么项目。 我们知道,
Iterator
IntoIterator
都定义了一个

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

type Item=::Item

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

总结如下:

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

    • Rust知道选择什么项目,因为我们专门告诉他选择什么
      项目。
      我们知道,
      Iterator
      IntoIterator
      都定义了一个

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

      type Item=::Item

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

      总结如下:

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

      我看不出这个问题,你从来没有提到过一个裸露的
      项目
      ,总是一个
      Self::项目
      O::项目
      ::项目
      。没有歧义。我很难理解这个问题,特别是“在
      Flatten
      中的
      仍然是
      O
      还是现在是
      Flatten::O::Item
      ?”在
      Flatten
      中的
      到底是什么?为什么应该是
      O
      ?那么
      flatte::O::Item
      应该是什么呢?如果你能澄清这个问题,那就太好了。
      flatte
      的实现有点奇怪了,顺便说一下,我当然不会把这个操作称为“扁平化”。@SvenMarnach这不是最终的实现,主持人在视频后面指出了错误。OP本可以在问题中包括这一点,不过。@NiklasMohrin我现在做了一个编辑来说明这一点。谢谢。我看不出这个问题,你从来没有提到过一个裸露的
      项目
      ,总是一个
      自我::项目
      O::项目
      ::项目
      。没有歧义。我很难理解这个问题,特别是“在
      Flatten
      中的
      仍然是
      O
      还是现在是
      Flatten::O::Item
      ?”在
      Flatten
      中的
      到底是什么?为什么应该是
      O
      ?那么
      flatte::O::Item
      应该是什么呢?如果你能澄清这个问题,那就太好了。
      flatte
      的实现有点奇怪了,顺便说一下,我当然不会把这个操作称为“扁平化”。@SvenMarnach这不是最终的实现,主持人在视频后面指出了错误。OP本可以在问题中包括这一点,不过。@NiklasMohrin我现在做了一个编辑来说明这一点。谢谢,谢谢你的解释。它帮助我发现我在阅读语法时有一个明显的逻辑漏洞。谢谢你的解释。它帮助我发现我在阅读语法时有一个明显的逻辑漏洞。