Nic*_*ick 5 iterator filter rust
我试图理解为什么以下代码无法编译(Playground):
fn inspection<I>(iter: I)
where
I: Iterator,
I::Item: Ord,
{
let inspection = iter
.filter(|x| x > 0);
}
fn main() {
let data = vec![1, 2, 3];
inspection(data.iter()); // or inspection(data.into_iter());
}
Run Code Online (Sandbox Code Playgroud)
错误是:
error[E0308]: mismatched types
--> src/main.rs:9:25
|
9 | .filter(|x| x > 0);
| ^ expected reference, found integral variable
|
= note: expected type `&<I as std::iter::Iterator>::Item`
found type `{integer}`
Run Code Online (Sandbox Code Playgroud)
我尝试按照这里解释的各种替代方法(通过取消引用元素)而没有成功.
第一次尝试:
.filter(|x| **x > 0);
Run Code Online (Sandbox Code Playgroud)
error[E0614]: type `<I as std::iter::Iterator>::Item` cannot be dereferenced
--> src/main.rs:13:21
|
13 | .filter(|x| **x > 0);
|
Run Code Online (Sandbox Code Playgroud)
第二次尝试:
.filter(|&x| *x > 0);
Run Code Online (Sandbox Code Playgroud)
error[E0614]: type `<I as std::iter::Iterator>::Item` cannot be dereferenced
--> src/main.rs:13:22
|
13 | .filter(|&x| *x > 0);
|
Run Code Online (Sandbox Code Playgroud)
为什么程序没有编译?
最大的问题(Lukas 涵盖了另一个问题)是您将迭代器的通用项与整数进行比较,而PartialOrd
/提供的比较Ord
仅在相同类型之间有效:
pub trait Ord: Eq + PartialOrd<Self> {
fn cmp(&self, other: &Self) -> Ordering;
...
}
Run Code Online (Sandbox Code Playgroud)
为了使类型T
与数字(在本例中为 )进行比较0
,T
必须是数字并且也0
必须是类型T
。包含有用数字特征的板条num
箱可以通过其Zero
提供通用特征的方式提供帮助0
:
extern crate num;
use num::Zero;
fn inspection<'a, I, T: 'a>(iter: I)
where
I: Iterator<Item = &'a T>,
T: Zero + PartialOrd // T is an ordered number
{
let inspection = iter.filter(|&x| *x > T::zero()); // T::zero() is 0 of the same type as T
}
fn main() {
let data = vec![1, 2, 3];
inspection(data.iter());
}
Run Code Online (Sandbox Code Playgroud)