Rust中是否有提供iter()
方法的特征?我只发现了特性IntoIterator
,它提供了into_inter()
。
在此明确说明:我不希望提供Iterator
的{{1}}特征,而是提供next()
的特征。
[旁注:有时我对Rust libs非常困惑。 iter()
提供Iterator
,但next()
提供IntoIterator
(不提供into_iter()
和提供移动的约定),而next()
是结构,实现IntoIter
特征(移动值)。 ]
答案 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);
}