Rhs在有关PartialEq的编译器错误消息中引用了什么?

时间:2017-08-18 20:25:06

标签: iterator rust

我正在尝试创建一个函数,它将两个迭代器作为参数,并通过引用迭代项目。每个Iterator项都应实现PartialEq

我的第一次尝试是:

fn compute<T: Iterator>(first: T, second: T, len: usize) -> usize
where
    T::Item: std::cmp::PartialEq,
{
    // ...
}

这编译但是迭代(据我所知)不是通过引用而是通过值,并且编译器在迭代时抱怨移动。

我的第二次尝试是这样的:

fn compute<'a, T>(first: T, second: T, len: usize) -> usize
where
    T: Iterator<Item = &'a std::cmp::PartialEq>,
{
    //...
}

导致编译器错误:

error[E0393]: the type parameter `Rhs` must be explicitly specified
 --> src/main.rs:3:28
  |
3 |     T: Iterator<Item = &'a std::cmp::PartialEq>,
  |                            ^^^^^^^^^^^^^^^^^^^ missing reference to `Rhs`
  |
  = note: because of the default `Self` reference, type parameters must be specified on object types

编译器在这里引用的Rhs(右侧?)是什么意思?为什么我需要参考它?如何将基于参考的有界Iterator传递给函数?

1 个答案:

答案 0 :(得分:4)

PartialEq是一个特性,可以让你比较两个值。这两个值 not 必须属于同一类型! 泛型类型 Rhs用于指定我们要比较的类型。默认情况下,Rhs的值与要与之比较的类型相同:

pub trait PartialEq<Rhs = Self> 
where
    Rhs: ?Sized, 

在这种情况下,您实际上是在请求迭代器值为特征对象 &PartialEq。如错误消息所示:

  

由于默认的Self引用,必须在对象类型

上指定类型参数

我们可以指定它:

fn compute<'a, T>(first: T, second: T, len: usize) -> usize
where
    T: Iterator<Item = &'a std::cmp::PartialEq<i32>>,

fn compute<'a, T: 'a>(first: T, second: T, len: usize) -> usize
where
    T: Iterator<Item = &'a std::cmp::PartialEq<&'a T>>,
  

但迭代(据我所知)不是通过引用而是通过值

它很可能通过引用进行迭代。请注意,T任何类型,i32&i32&mut i32所有类型。你的第一个例子是我将使用的签名的制定:

fn compute<T: Iterator>(first: T, second: T, len: usize) -> usize
where
    T::Item: std::cmp::PartialEq,
{
    42
}

fn main() {
    let a = [1, 2, 3];
    let b = [4, 5, 6];

    compute(a.iter(), b.iter(), 1);
    compute(a.iter(), b.iter(), 2);
    compute(a.iter(), b.iter(), 3);
}