首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Iterator与IntoIterator的平面化

Iterator与IntoIterator的平面化
EN

Stack Overflow用户
提问于 2020-10-06 03:54:39
回答 1查看 1.9K关注 0票数 1

我正在使用迭代器,我一直在使用Flatten来更好地理解迭代器是如何工作的。这个例子:

代码语言:javascript
复制
assert_eq!(vec![1, 2].iter().flatten().count(), 2);

不编译并给出错误(主要关注的错误):

代码语言:javascript
复制
error[E0277]: `&{integer}` is not an iterator
  --> src/lib.rs:59:38
   |
59 |         assert_eq!(vec![1, 2].iter().flatten().count(), 2);
   |                                      ^^^^^^^ `&{integer}` is not an iterator
   |
   = help: the trait `std::iter::Iterator` is not implemented for `&{integer}`
   = note: required because of the requirements on the impl of `std::iter::IntoIterator` for `&{integer}`

让我困惑的是,看起来Flatten需要嵌套的Item来实现IntoIterator。我在金沙医生那里证实了这一点,在那里他们宣布

代码语言:javascript
复制
pub struct Flatten<I> 
where
    I: Iterator,
    <I as Iterator>::Item: IntoIterator

刚准备好文档,IntoIterator就提供了一种方法来定义如何将类型转换为迭代器。为什么特征不能是<I as Iterator>::Item: Iterator呢?当然,如果嵌套项实现了Iterator,那么我们将得到相同的Flatten,因为嵌套项必须是迭代器本身。使用IntoIterator会带来什么不同/好处?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-06 04:18:57

需要IntoIterator而不是Iterator,除了迭代器集合之外,还可以使集合扁平化。

集合类型(例如,Vec )与迭代器类型不同,因此如果flatten要求项目为Iterator,则不能将Vec of Vecs压平。

IntoIterator表示可以转换为迭代器的类型,例如Vec或许多其他集合(或迭代器!)。因此,例如,这样做是可行的:

代码语言:javascript
复制
fn main() {
    let nested_vec: Vec<Vec<i32>> = vec![vec![1, 2], vec![3, 4]];
    let flat_vec: Vec<i32> = nested_vec.into_iter().flatten().collect();
    println!("{:?}", flat_vec);
}

你可以在游乐场上试试这个例子。使用上面的into_iter()而不是iter()可以确保我们在i32s上迭代,而不是引用i32s。(谢谢Cerberus建议使用into_iter()而不是copied())。

(您可以看到更多使用IntoIterator实现在docs的“在外部类型上的实现”部分的类型。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64219127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档