gpt4 book ai didi

rust - Iterator vs IntoIterator 用于扁平化

转载 作者:行者123 更新时间:2023-12-03 11:36:55 24 4
gpt4 key购买 nike

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

assert_eq!(vec![1, 2].iter().flatten().count(), 2);
不编译并给出错误(这是关注的主要错误):
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 .我在他们声明的 rustdocs 中证实了这一点
pub struct Flatten<I> 
where
I: Iterator,
<I as Iterator>::Item: IntoIterator
刚刚准备好文档,IntoIterator 只是提供了一种方法来定义如何将类型转换为迭代器。为什么 trait bound 不能是 <I as Iterator>::Item: Iterator ?当然,如果嵌套项实现 Iterator , 那么我们得到相同的 Flatten因为嵌套项本身必须是迭代器。使用它有什么不同/好处 IntoIterator反而?

最佳答案

需要 IntoIterator而不是 Iterator除了迭代器集合之外,还允许您展平集合集合。
集合类型,例如 Vec , 不同于迭代器类型,所以如果 flatten要求项目为 Iterator s 你不能把 Vec 弄平的 Vec s。IntoIterator表示可以转换为迭代器的类型,例如 Vec或许多其他集合(或迭代器!)。因此,例如,这有效:

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);
}
您可以 try this example on the Playground .使用 into_iter()上面而不是 iter()确保我们遍历 i32 s,而不是对 i32 的引用s。 (感谢 Cerberus 建议 into_iter() 而不是 copied() 。)
(您可以通过 IntoIterator 实现 in the docs' "Implementations on Foreign Types" section 看到更多类型。)

关于rust - Iterator vs IntoIterator 用于扁平化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64219127/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com