2016-09-24 70 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的評論中的鏈接,這是我需要的! –