2017-12-15 6 views

答えて

5

形質あります。イテレータを表す型はこの特性を実装します。

これはより一般的な質問の例です。「どのように構造体の特性値を格納できますか?」私は故意に質問を不正確な形で表現しました。実際には、を実装する型の値を格納することが必要であり、広く行うには2つの方法があります。

最も簡単な方法は、Box<Iterator<Item = T>>を使用することですボックス

でそれを入れてください。 Boxは所有ポインタを表し、Rustは特性オブジェクトへのポインタを持っているときにその型に関する実行時情報を含む「ファットポインタ」を作成します。この方法では、反復子の具体的な型はコンパイル時には分かりません。

struct IteratorHolder { 
    iter: Box<Iterator<Item = u32>>, 
} 

と使用方法:定義は次のようになります

let ih = IteratorHolder { iter: Box::new(0..10) }; 
println!("{:?}", ih.iter.collect::<Vec<_>>()); 

ジェネリック

ヒープ上の任意のボックスを割り当てる回避しながら、同じことを行う別の方法であり、ジェネリック構造体を使用する。このようにして、Iterator<Item = T>を実装するいくつかの型があります。具体的にはコンパイル時に決定されます。

定義:

struct IteratorHolder<I: Iterator<Item = u32>> { 
    iter: I, 
} 

と使用方法:

let ih = IteratorHolder { iter: 0..10 }; 
println!("{:?}", ih.iter.collect::<Vec<_>>()); 
関連する問題