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

2023-12-31

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

我不知道该错误意味着什么:例如,列表不能少于两个元素。也许闭包参数是错误的?我试图改变它,但这并没有改变任何东西。a and b被正确检测为u64我的 IDE 中也有。这里发生了什么?


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

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

编译器在任何地方都不知道这些信息。实施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
}

也可以看看:

  • 如何将切片转换为数组引用? https://stackoverflow.com/q/48129565/155423
  • 当没有类型参数或归属时,如何暗示值的类型? https://stackoverflow.com/q/41882151/155423

或者,您可以使用整数迭代器并将其分块。

也可以看看:

  • 是否有相当于 slice::chunks/windows 的迭代器来循环对、三元组等? https://stackoverflow.com/q/42134874/155423

在未来的某个时刻,常量泛型可能会稳定下来并允许将数组长度烘焙到函数调用和返回类型中。

也可以看看:

  • 是否可以使用泛型的类型参数来控制数组的大小? https://stackoverflow.com/q/28136739/155423
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我不能使用切片模式来过滤 Window 迭代器? 的相关文章

随机推荐