有没有提供`iter()`的特质?

时间:2016-09-24 11:43:01

标签: iterator rust traits

Rust中是否有提供iter()方法的特征?我只发现了特性IntoIterator,它提供了into_inter()

在此明确说明:我不希望提供Iterator的{​​{1}}特征,而是提供next()的特征。

[旁注:有时我对Rust libs非常困惑。 iter()提供Iterator,但next()提供IntoIterator(不提供into_iter()和提供移动的约定),而next()是结构,实现IntoIter特征(移动值)。 ]

1 个答案:

答案 0 :(得分:10)

不,没有提供iter()的特征。

但是,IntoIterator是在引用上对某些容器实施的。例如,Vec<T>, &Vec<T> and &mut Vec<T>是实现IntoIterator的三种不同类型,您会注意到它们都映射到不同的迭代器。实际上,Vec::iter()Vec::iter_mut()只是分别等同于&Vec::into_iter()&mut Vec::into_iter()的便捷方法。

fn foo(_x: std::slice::Iter<i32>) {}

fn main() {
    let v = vec![1, 2, 3];
    foo(v.iter());
    foo((&v).into_iter()); // iter() exists because this is awkward
}

如果你想编写一个通用容器的泛型函数,可以转换成迭代引用的迭代器,你可以这样做:

fn foo<'a, I: IntoIterator<Item=&'a i32>>(_x: I) {}

fn main() {
    let v = vec![1, 2, 3];
    foo(&v);
}