2015-06-25 47 views
3

我試圖瞭解如何使用範圍與迭代器。如果我聲明一個範圍並將其與迭代器一起使用,是否有可能在另一個迭代器中重用該範圍? 例如,這不會編譯:重複使用範圍迭代

fn main() { 
    let smallr = 0..10; 
    for i in smallr { 
     println!("value is {}", i); 
    } 

    //let smallr = 0..15; re-defining smallr will work! 
    let sum = smallr.fold(0, |sum, x| sum + x); 
    println!("{}", sum); 
} 

回答

3

範圍類型Range不實現Copy。因此,在for循環中使用範圍會消耗它。如果你想創建一個範圍的副本,你可以使用.clone()

for i in smallr.clone() { 
    println!("value is {}", i); 
} 

需要注意的是一個可變的範圍內使用時(其中據我所知是爲什麼Range沒有實現Copy的原因),這可能會導致混亂行爲。範圍同時也是一個迭代器。如果你只是部分地使用迭代器然後克隆它,那麼你會得到部分消耗的迭代器的克隆。

作爲陷阱的示例:

fn main() { 
    let mut smallr = 0..10; 

    println!("first: {:?}", smallr.next()); 
    for i in smallr.clone() { 
     println!("value is {}", i); 
    } 
} 

打印

first: Some(0) 
value is 1 
value is 2 
value is 3 
value is 4 
value is 5 
value is 6 
value is 7 
value is 8 
value is 9 

這表明該範圍的第一值不是克隆迭代器的一部分。