2016-09-24 8 views
2

iter()メソッドを提供するRust a Traitはありますか?私はIntoIteratorという形質を見つけました。これはinto_inter()です。`iter()`を提供する特性はありますか?

Iteratorの形質はnext()ですが、iter()を提供する形質は望ましくありません。

[sidenote:時々、私はRustのライブラリで非常に混乱しています。 Iteratornext()ですが、IntoIteratorinto_iter()を供給しています(next()を供給せず、慣例としては移動用)。IntoIterは構造体で、Iterator特性(移動値)を実装しています。 ]

+0

ます。https://のstackoverflow。 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を実装する3つの別々の型であり、それらはすべて異なるイテレータにマップされています。実際には、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のコメントのリンクと組み合わせると、これが私の必要なものです! –

関連する問題