2016-09-01 6 views
1

私は、次のような定義があります自分の構造体のためにPartialEqをVectorに実装するには?

impl<T: PartialEq> PartialEq for List<T> { 
    fn eq(&self, other: &List<T>) -> bool { 
     self.memory == other.memory  
    } 
} 
impl<T: fmt::Debug> fmt::Debug for List<T> where T:Display { 
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 
     try!(write!(f, "[")); 
     for (count, v) in self.memory.iter().enumerate() { 
      if count != 0 { try!(write!(f, ", ")); } 
      try!(write!(f, "{}", v)); 
     } 
     write!(f, "]") 
    } 
} 
impl<T> List<T> { 
    pub fn new() -> Self { 
     List { 
      memory: Vec::new(), 
     } 
    } 
    // push() add to end of list 
    pub fn push(&mut self, value: T) { 
     self.memory.push(value); 
    } 
} 

しかし、私は次のように、一致式を使用How can I implement PartialEq?

に記述のように、私はこのタイプの#[derive(PartialEq)]の同等になるだろう

pub struct List<T> { 
    memory: Vec<T>, 
} 

をコンパイラは私にこれらのエラーを与える:

error: mismatched types [E0308]

if ! (* left_val == * right_val) {

note: in this expansion of assert_eq!

help: run rustc --explain E0308 to see a detailed explanation

note: expected type librusty_data_structures::List<u32>

note: found type [_; 4]

0123それが重要な理由エラー

let mut listex: List<u32> = List::new(); 
listex.push(17); 
listex.push(18); 
listex.push(19); 
listex.push(20);    
assert_eq!(listex, [17, 18, 19, 20]); 

をコンパイル生成

main.rsは、私は理解していません。なぜそれはそのタイプを見ているのですか?

+0

コードは私のためにコンパイルされること。あなたは、そのエラーをスローする完全なファイルを投稿できますか? main.rsで – Dogbert

+0

を更新すると、そのエラーがスローされます。 – LeMoussel

+0

'List 'は '[T;]に匹敵しますか? 4] '同様に? 'List 'の 'PartialEq >'を 'List 'と 'List 'としか比較できないように実装していることに注意してください) – Dogbert

答えて

2

listex[17, 18, 19, 20]のタイプが異なるため(List<u32>[_; 4])、それらの同等性を確認することはできません。タイプが一致するように、引数の1つのタイプをassert_eq!()に変更する必要があります。

assert_eq!(&listex.memory[0..4], [17, 18, 19, 20]);

それともList<T>ためPartialEq実装がアクションに入れることができるようにあなたがList<u32>[17, 18, 19, 20]を変換することができます:最も簡単なオプションがlistexmemoryを参照するようになります。

あなたが別のList<32>listexを比較した場合(あなたがそれらにassert_eq!()を行う行うためにDebugを導出するList<T>が必要になりますが)、あなたのPartialEq実装が平等のためのチェックを可能にします。

編集:あなたの質問のためとして、「なぜそれもそのタイプを見ている?」、PartialEqの実装であることに気づく:

fn eq(&self, other: &List<T>)

あなたは2つのだけの引数のためにそのeq作品を指定しますタイプ&List<T>&selfを指し、List<T>を指します)。ここで

+0

この例では、簡単な '#[derive(Debug)]'で十分です。 – ljedrz

1

は、テストするために錆プログラミング言語フォーラム

impl<T, U> PartialEq<U> for List<T> 
    where Vec<T>: PartialEq<U> 
{ 
    fn eq(&self, other: &U) -> bool { 
     self.memory.eq(other) 
    } 
} 

cuviper responseを以下、ソリューションです:

let mut listex: List<u32> = List::new(); 

listex.push(17); 
listex.push(18); 
listex.push(19); 
listex.push(20);    

println!("{}", listex == [17, 18, 19, 20]); 
関連する問題