Rhs 在有关 PartialEq 的编译器错误消息中指的是什么?

lwi*_*lwi 1 iterator rust

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

我的第一次尝试是:

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

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

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

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

导致编译器错误:

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

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

She*_*ter 5

PartialEq是一种特性,允许您比较两个值。这两个值都没有必须是同一类型的!该泛型类型 Rhs是用来指定何种类型,我们用比较。默认情况下,的值与Rhs正在比较的类型相同:

pub trait PartialEq<Rhs = Self> 
where
    Rhs: ?Sized, 
Run Code Online (Sandbox Code Playgroud)

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

由于默认Self引用,必须在对象类型上指定类型参数

我们可以指定它:

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

或者

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

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

它很有可能通过引用进行迭代。请记住,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);
}
Run Code Online (Sandbox Code Playgroud)