2017-08-18 8 views
0

私は、パラメータとして2つのイテレータをとり、参照によってアイテムを反復する関数を作成しようとしています。各IteratorアイテムはPartialEqを実装する必要があります。PartialEqに関するコンパイラエラーメッセージでRhsは何を参照していますか?

私の最初の試みだった:

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は左手側に、右手系は右手用に使用されます(私は識別子が好きではないので、一つの手紙で違います)。 –

答えて

4

PartialEqは、2つの値を比較できる特性です。それらの2つの値はではなく、は同じタイプでなければなりません! ジェネリックタイプ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); 
} 
関連する問題