簡體   English   中英

為什么我不能使用切片模式來過濾 Window 迭代器?

[英]Why can I not use a slice pattern to filter a Window iterator?

我有一個數字向量,並使用windows(2)方法創建一個迭代器,該迭代器為我提供相鄰對。 例如,向量[1, 2, 3]被轉換為[1, 2], [2, 3] 我想使用find方法找到滿足特定條件的切片:

fn step(g: u64) -> Option<(u64, u64)> {
    let prime_list: Vec<u64> = vec![2, 3, 5, 7]; //For example
    if prime_list.len() < 2 {
        return None;
    }
    let res = prime_list.windows(2).find(|&&[a, b]| b - a == g)?;
    //...
    None
}

我收到一個錯誤:

error[E0005]: refutable pattern in function argument: `&&[]` not covered
 --> src/lib.rs:6:43
  |
6 |     let res = prime_list.windows(2).find(|&&[a, b]| b - a == g)?;
  |                                           ^^^^^^^^ pattern `&&[]` not covered

我不知道那個錯誤意味着什么:例如,列表不能少於兩個元素。 也許閉包參數是錯誤的? 我試圖改變它,但這並沒有改變任何東西。 ab在我的 IDE 中也被正確檢測為u64 這里發生了什么?

你,程序員,知道每個迭代值的長度都是 2,但是你怎么知道呢? 您只能從 function 的散文文檔中看出:

返回所有長度大小的連續 windows 的迭代器。 windows 重疊。 如果切片比大小短,則迭代器不返回任何值。

編譯器不知道此信息。 Windows的實現僅聲明迭代值將是一個切片:

impl<'a, T> Iterator for Windows<'a, T> {
    type Item = &'a [T];
}

我會將切片轉換為數組引用,丟棄任何長度錯誤的切片(您知道這是不可能發生的):

use std::convert::TryFrom;

fn step(g: u64) -> Option<(u64, u64)> {
    let prime_list: Vec<u64> = vec![2, 3, 5, 7]; // For example

    if prime_list.len() < 2 {
        return None;
    }

    let res = prime_list
        .windows(2)
        .flat_map(<&[u64; 2]>::try_from)
        .find(|&&[a, b]| b - a == g)?;
    //...
    None
}

也可以看看:

或者,您可以使用整數迭代器並將其分塊。

也可以看看:

在未來的某個時候, const generics可能會穩定下來,並允許將數組長度烘焙到 function 調用和返回類型中。

也可以看看:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM