2016-09-24 36 views
2

Rust中是否存在提供iter()方法的特征?我只发现了IntoIterator,供应into_inter()是否有提供`iter()`的特质?

只是要清楚在这里:我不想Iterator特性,它提供next(),但它提供iter()一个特质。

[旁注:有时候我很害怕Rust libs。 Iterator用品next(),但IntoIterator用品into_iter()(不提供next()和约定移动),而IntoIter是一个结构,它实现Iterator特质(移动值)。 ]

+0

https://开头计算器。 com/questions/36672845/in-rust-is-a-vector-an-iterator/36673695#36673695 – starblue

回答

9

不,没有提供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); 
} 
+0

哇。非常感谢你的解释。结合starblue的评论中的链接,这是我需要的! –