为什么不能使用切片模式来过滤Window迭代器?

问题描述 投票:1回答:1

我有一个数字向量,并使用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

我不知道该错误是什么意思:例如,列表不能少于两个元素。也许闭包参数是错误的?我试图改变它,但是并没有改变任何东西。我的IDE中也正确地将ab检测为u64。这是怎么回事?

rust closures
1个回答
2
投票

您,程序员,知道每个迭代值的长度为2,但是您怎么知道?您只能从函数的散文文档中得知:

返回所有长度大小相邻的窗口上的迭代器。窗户重叠。如果切片小于大小,则迭代器不返回任何值。

编译器在任何地方都不知道此信息。 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泛型可能会稳定下来,并允许将数组长度烘焙到函数调用和返回类型中。

另请参见:

© www.soinside.com 2019 - 2024. All rights reserved.