实现 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: 我想我现在明白了。 Iterator
有 Item
,所以我们可以写 O::Item: IntoIterator
。当我们定义 type Item = <O::Item as IntoIterator>::Item
时,我们为 Flatten
而不是 O
指定了 return 项目类型。我被语法搞糊涂了,有些不合逻辑的理解。
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
=> 内部 IntoIterator::Item
用于展平
Self::Item
=> 展平为迭代器 Item
。与上一个匹配。
Flatten::Item
=> 与 Iterator
实施的 Self::Item
相同。
我正在观看 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: 我想我现在明白了。 Iterator
有 Item
,所以我们可以写 O::Item: IntoIterator
。当我们定义 type Item = <O::Item as IntoIterator>::Item
时,我们为 Flatten
而不是 O
指定了 return 项目类型。我被语法搞糊涂了,有些不合逻辑的理解。
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
=> 内部IntoIterator::Item
用于展平Self::Item
=> 展平为迭代器Item
。与上一个匹配。Flatten::Item
=> 与Iterator
实施的Self::Item
相同。