为什么我的迭代器过滤器中的比较操作不适用于泛型类型?

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)

为什么程序没有编译?

lje*_*drz 3

最大的问题(Lukas 涵盖了另一个问题)是您将迭代器的通用项与整数进行比较,而PartialOrd/提供的比较Ord仅在相同类型之间有效:

pub trait Ord: Eq + PartialOrd<Self> {
    fn cmp(&self, other: &Self) -> Ordering;
    ...
}
Run Code Online (Sandbox Code Playgroud)

为了使类型T与数字(在本例中为 )进行比较0T必须是数字并且也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)