Rust 中 peekable 的使用

在 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);
    }
}

輸出:

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 本身是_偷看,窺視_的意思

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);
            }
        }
    }
}

輸出爲:

5
9

如上 創建了一個 Vec<i32> 的迭代器,並使用 peekable 方法使其成爲 Peekable 迭代器。

使用 while let 循環遍歷迭代器。在每次循環中,使用 iter.next() 獲取當前元素。

使用 iter.peek() 查看下一個元素,但不從迭代器中移除它。

如果下一個元素是偶數(next % 2 == 0),打印出當前元素。

如此,這段代碼遍歷了整個 Vec<i32>,只有在下一個元素是偶數時,纔會打印當前元素。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/FCK0wFAfL1BWym4XDeLGQg