为什么我不能使用切片模式来过滤 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 迭代器? 的相关文章

  • 检查 Option 是否包含特定 Some 值的最佳方法?

    您不能执行以下操作 if option is some option 1 既然如果option is some false第二次比较会出错 做这样的事情的最好方法是什么 我现在正在做什么 if option is some if optio
  • VacantEntry 未在名为 set 的范围内实现任何方法

    这段代码 use std collections hash map Entry Occupied Vacant use std collections HashMap fn main let mut vars HashMap
  • 如何指定 AsRef 的生命周期?

    我正在尝试编写一个函数来连接两个可迭代对象 其项目可以转换为OsStr引用 并且在尝试指定引用的生命周期时遇到了巨大的困难 use std convert AsRef use std ffi OsStr use std marker Pha
  • PHP 何时实现了函数使用闭包? [复制]

    这个问题在这里已经有答案了 我在 PHP 手册中找不到解释的部分use 我有代码 num 0 array walk recursive REQUEST function mValue use num num 我的 Eclipse 抱怨 Pa
  • clap::App 多次调用方法移动所有权

    即使阅读了有关引用所有权和借用的章节后 我仍然无法理解以下代码中的某些内容 这有效地阻止了我从clap App extern crate clap use clap App fn main let mut app App new name
  • 为外国类型实现外国特征[重复]

    这个问题在这里已经有答案了 因此 我认为出于前向兼容性考虑 以防止在库中添加进一步的特征实现破坏使用类型特征的地方 有理由禁止孤立特征实现 并且它可能使编译变得更加困难 但我想知道 Rust 社区认为哪种解决方法是最理想的 以防万一这还不够
  • 为什么这不是悬空引用?

    我正在关注第二版TRPL 书 https doc rust lang org book second edition 第二版 并且对其中一项任务有点困惑 在 的最后第10 2节 https doc rust lang org book se
  • Rust ABI 对枚举紧凑性做出了哪些保证?

    据我所知 Rust ABI 并不稳定 然而 Rust 编译器目前执行一些优化 将字段压缩为标签 use std mem size of enum Node N1 1 is good bool stuff u32 N1 2 is good b
  • 了解特征和对象安全

    我正在努力学习对象安全的基础知识 如果我有这个代码 struct S x i32 trait Trait Sized fn f self gt i32 where Self Sized fn object safety dynamic x
  • 为什么在闭包参数中使用“&&”?

    我有两个问题这个例子 https doc rust lang org std iter trait Iterator html method find let a 1 2 3 assert eq a iter find x x 2 Some
  • 如何让 Visual Studio Code 重置 Rust 的 IntelliSense 引擎?

    我正在开发两个项目 一个是一个库 另一个是使用该库的程序 当我对库进行更改时 其他窗口 程序 看不到这些更改 因此我没有获得更新的 IntelliSense 关闭使用该库的程序并重新打开它确实会强制更新 但我真的不想走那么远 直接回答标题
  • 由于递归结构中存在冲突的要求,无法推断适当的生命周期

    当我尝试编译这段代码时 pub struct Context lt a gt pub outer Option lt a mut Context lt a gt gt impl lt a gt Context lt a gt pub fn
  • 在没有 std 的情况下将 *mut u8 转换为 &[u8]

    我正在为 WebAssembly 编写 Rust 代码来处理来自 JavaScript 的字符串 由于 WebAssembly 没有真正的字符串类型 因此我尝试传递一个指向 WebAssembly 内存对象的指针 该对象指向 UTF 8 编
  • IntoIterator 类型的特征对象可以装箱并保存在结构内部吗?

    可以特征类型的对象IntoIterator装箱并保存在结构内部 我有一种情况 我想存储一个可以转换为迭代器的对象向量 我的尝试是代码 struct Foo foo Vec
  • 如何理解 lambda 中的闭包? [复制]

    这个问题在这里已经有答案了 我想循环制作 5 个按钮 并为每个按钮绑定一个命令来打印索引 在以下解决方案中 它始终打印相同的索引 我的代码是这样的 for i in range 5 make button Tkinter Button fr
  • 从所有者对象读取时可变的自身

    我有一个对象拥有另一个对象 拥有的对象有一个可变方法 该方法依赖于其所有者的非可变方法 架构 尽可能简化 如下所示 struct World animals Vec
  • 有条件地从 flat_map 返回空迭代器

    鉴于这个定义foo let foo vec vec 1 2 3 vec 4 5 6 vec 7 8 9 我希望能够编写这样的代码 let result Vec lt gt foo iter enumerate flat map i row
  • 如何对另一个数字进行模运算而不溢出?

    我正在尝试为 Rust 实现快速素性测试u32 and u64数据类型 作为其中的一部分 我需要计算 n n d where n and d are u32 or u64 分别 虽然结果可以很容易地适合数据类型 但我不知道如何计算它 据我所
  • 如何使用diesel-rs选择色谱柱的子集?

    我现在花了几个小时的时间来查询表的可用列的子集以及在其中包含计算 我知道这不是在选择查询中执行计算的最佳方式 但现在 我只是在开发一个原型 它应该是可行的 我在用diesel rs作为后端实现中所有数据库操作的 ORM 数据将存储在 Pos
  • 为什么我要使用发散函数?

    读 Rust 书时 我发现一个有趣的话题 发散函数 https doc rust lang org stable book first edition functions html diverging functions Rust 有一些特

随机推荐