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我现在做了一个编辑来说明这一点。谢谢,谢谢你的解释。它帮助我发现我在阅读语法时有一个明显的逻辑漏洞。谢谢你的解释。它帮助我发现我在阅读语法时有一个明显的逻辑漏洞。