2016-08-04 9 views
2

どうすればいいですか?for ... inループはそれが動作しているイテレータを借りますか?例えば:それはIteratorオブジェクトに&Iteratorを変換することはできませんのでforループはどのようにしてイテレータを借りていますか?

let x = vec![1, 2, 3, 4]; 
let i = x.iter(); 
for a1 in i { break; } // iterate over just one "i" 
for a2 in i { break; } // continue iterating through "i" here 

あなたは、単に、のために&iを与えることはできません。

答えて

2

あなたはイテレータを借りて、ボローが終了した後、それを使用し続けることIterator::by_refを使用することができます。

fn main() { 
    let x = vec![1, 2, 3, 4]; 
    let mut i = x.iter(); 
    for _ in i.by_ref() { break; } // iterate over just one "i" 
    for _ in i.by_ref() { break; } // continue iterating through "i" here 
    assert_eq!(Some(&3), i.next()) 
} 
+0

これは、良い答え、bあなたが 'i'に入れ子になっているイテレータを(変更不可能であっても)持たせたいなら、それは失敗します。 – njaard

2

すべてのイテレータは、イテレータを進め01​​機能を持っており、Option<Self::Item>を返します(つまり、彼らはNoneたり、反復処理しているものは何でもタイプの値を含むSomeのいずれかを返します。あなたが手動でインクリメントするために、この機能を自分で呼び出すことができますそれはこの場合には、あなたの問題を解決するように聞こえるしたいイテレータしかし何回も、

関連する問題