我正在使用迭代器,我一直在使用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。我在金沙医生那里证实了这一点,在那里他们宣布
pub struct Flatten<I>
where
I: Iterator,
<I as Iterator>::Item: IntoIterator刚准备好文档,IntoIterator就提供了一种方法来定义如何将类型转换为迭代器。为什么特征不能是<I as Iterator>::Item: Iterator呢?当然,如果嵌套项实现了Iterator,那么我们将得到相同的Flatten,因为嵌套项必须是迭代器本身。使用IntoIterator会带来什么不同/好处?
发布于 2020-10-06 04:18:57
需要IntoIterator而不是Iterator,除了迭代器集合之外,还可以使集合扁平化。
集合类型(例如,Vec )与迭代器类型不同,因此如果flatten要求项目为Iterator,则不能将Vec of Vecs压平。
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);
}你可以在游乐场上试试这个例子。使用上面的into_iter()而不是iter()可以确保我们在i32s上迭代,而不是引用i32s。(谢谢Cerberus建议使用into_iter()而不是copied())。
(您可以看到更多使用IntoIterator实现在docs的“在外部类型上的实现”部分的类型。)
https://stackoverflow.com/questions/64219127
复制相似问题