在 Rust 中,从迭代器中获取(也就是“消费”)一个元素时,每次调用 next
方法都会“消费”迭代器的一个元素,这意味着此元素被从迭代器中移除并返回给调用者, 一旦一个元素被消费,它就不能再次从同一个迭代器中获取。如下:
fn main() {
let numbers = vec![1, 3, 5, 4, 9, 6, 7];
let mut iter = numbers.iter(); // 创建一个迭代器
// 消费第一个元素
if let Some(first) = iter.next() {
println!("The first number is {}", first);
}
// 继续消费剩余的元素
for number in iter {
println!("Next number: {}", number);
}
}
输出:
代码语言:javascript复制The first number is 1
Next number: 3
Next number: 5
Next number: 4
Next number: 9
Next number: 6
Next number: 7
iter.next()
首先被调用来消费第一个元素。一旦这个元素被消费,它就不再是迭代器的一部分了。随后的 for
循环继续迭代剩余的元素,每次迭代循环都会消费一个元素,直到所有元素被消费完毕。
假如有这样一个Vec,有这样一个需求:如果下一个元素是偶数,则打印出当前元素。
这时就要用到迭代器的 peekable
方法, 其允许查看迭代器中的下一个元素,而不会消费它。
这样,就可以根据下一个元素的值来决定是否打印当前元素。
peek本身是偷看,窥视的意思
代码语言:javascript复制fn main() {
let numbers = vec![1, 3, 5, 4, 9, 6, 7];
let mut iter = numbers.iter().peekable();
while let Some(¤t) = iter.next() {
if let Some(&&next) = iter.peek() {
if next % 2 == 0 {
println!("{}", current);
}
}
}
}
输出为:
代码语言:javascript复制5
9
如上 创建了一个 Vec<i32>
的迭代器,并使用 peekable
方法使其成为 Peekable
迭代器。
使用 while let
循环遍历迭代器。在每次循环中,使用 iter.next()
获取当前元素。
使用 iter.peek()
查看下一个元素,但不从迭代器中移除它。
如果下一个元素是偶数(next % 2 == 0
),打印出当前元素。
如此,这段代码遍历了整个 Vec<i32>
,只有在下一个元素是偶数时,才会打印当前元素。