重复使用一个范围进行迭代

5

我正在尝试理解如何使用迭代器范围。如果我声明一个范围并将其与迭代器一起使用,是否可以使用另一个迭代器重新使用该范围?例如,以下代码无法编译:

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);
}
1个回答

4

范围类型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

这说明范围的第一个值不是克隆迭代器的一部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接