我有一个数字向量,并使用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中也正确地将a
和b
检测为u64
。这是怎么回事?
您,程序员,知道每个迭代值的长度为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泛型可能会稳定下来,并允许将数组长度烘焙到函数调用和返回类型中。
另请参见: