![](/img/trans.png)
[英]Trait implements Iterator, but cannot use a struct implementing my trait as an Iterator
[英]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:我想我现在明白了。 Iterator
有Item
,所以我们可以写O::Item: IntoIterator
。 当我们将type Item = <O::Item as IntoIterator>::Item
定义type Item = <O::Item as IntoIterator>::Item
,我们指定的是Flatten
的返回 Item 类型,而不是O
。 我被语法弄糊涂了,有一些不合逻辑的理解。
Rust 知道要选择什么项目,因为我们特别告诉他要选择什么Item
。 我们知道Iterator
和IntoIterator
定义了一个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.