我试图了解如何将范围与迭代器一起使用。如果我声明一个范围并将其与迭代器一起使用,是否可以与另一个迭代器一起重复使用该范围?例如,这不会编译:
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);
}
Run Code Online (Sandbox Code Playgroud)
范围类型Range未实现Copy. 因此,在 for 循环中使用范围会消耗它。如果要创建范围的副本,可以使用.clone():
for i in smallr.clone() {
println!("value is {}", i);
}
Run Code Online (Sandbox Code Playgroud)
请注意,当在可变范围上使用时,这可能会导致令人困惑的行为(据我所知,这就是为什么Range不实现Copy)。范围同时也是一个迭代器。如果您仅部分消耗迭代器然后克隆它,您将获得部分消耗的迭代器的克隆。
作为陷阱的一个例子:
fn main() {
let mut smallr = 0..10;
println!("first: {:?}", smallr.next());
for i in smallr.clone() {
println!("value is {}", i);
}
}
Run Code Online (Sandbox Code Playgroud)
印刷
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
Run Code Online (Sandbox Code Playgroud)
这表明该范围的第一个值不是克隆迭代器的一部分。