2017-08-18 39 views
0

我正在尝试创建一个函数,它将两个迭代器作为参数并通过引用对项目进行迭代。每个Iterator项目应执行PartialEqRhs在关于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传递给函数?

+0

不是每个迭代器都有它可以返回引用的项目。我想你需要展示你如何使用第一个'compute'和编译器错误;目前还不清楚为什么这样做不起作用。 – trentcl

+0

当您在'Item ='之后编写'PartialEq'时,它在*类型上下文中*,因此它被解释为特征对象,而不是特征。 – Rufflewind

+0

你是正确的缩写:LHS用于左手边和RHS右手边当谈论二元操作符时(我个人更喜欢把它们称为左和右,因为我不喜欢标识符不同的单个字母)。 –

回答

4

PartialEq是一个特征,允许您比较两个值。这两个值做而不是必须是相同的类型! 通用类型Rhs用于指定我们正在比较的类型。缺省情况下,Rhs值是一样的类型正在被比较:

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

在这种情况下,你实际上是要求迭代器值是特质对象&PartialEq。由于错误消息指出:

because of the default Self reference, type parameters must be specified on object types

我们可以指定它:

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>>, 

but iterates (as far as I understand) not by reference but by value

它很可能为它引用遍历。请记住,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); 
} 
相关问题