2016-06-15 13 views
0

を比較する比較の可能性を実現する必要がありますFoo<i32>Foo<u32>です。`Foo <i32>`と `Foo <u32>`

struct Foo<T> { 
    id: usize, 
    data: T 
} 
impl<T> Foo<T> { 
    fn new_i32(i: i32) -> Foo<i32> { 
     Foo { 
      id: 0, 
      data: i 
     } 
    } 
    fn new_u32(u: u32) -> Foo<u32> { 
     Foo { 
      id: 1, 
      data: u 
     } 
    } 
} 

問題が同じタイプを比較できるよう特色PartialEqです。

impl<T> PartialEq for Foo<T> { 
    fn eq(&self, other: &Self) -> bool { 
     self.id == other.id 
    } 
} 

そして、このいけない仕事:

let a = Foo::new_u32(123); 
let b = Foo::new_i32(123); 
println!("{}", a == b); 

全コードplay.rust-lang.org

答えて

4

に問題が同じタイプを比較できるよう特色PartialEqです。

これは正しくありません。それだけでデフォルトSelfと同じ型にRhs

pub trait PartialEq<Rhs = Self> where Rhs: ?Sized { 
    ... 
} 

は、ここでは、任意のLRためFoo<L>Foo<R>ためPartialEqを実装してみましょう:

impl<L, R> PartialEq<Foo<R>> for Foo<L> { 
    fn eq(&self, other: &Foo<R>) -> bool { 
     self.id == other.id 
    } 
} 

注意私も変更しなければならなかったことimplいくつかの型推論エラーを修正するブロック。最終的なコード:

struct Foo<T> { 
    id: usize, 
    data: T, 
} 

impl Foo<i32> { 
    fn new_i32(i: i32) -> Foo<i32> { 
     Foo { id: 0, data: i } 
    } 
} 

impl Foo<u32> { 
    fn new_u32(u: u32) -> Foo<u32> { 
     Foo { id: 1, data: u } 
    } 
} 

impl<L, R> PartialEq<Foo<R>> for Foo<L> { 
    fn eq(&self, other: &Foo<R>) -> bool { 
     self.id == other.id 
    } 
} 

fn main() { 
    let a = Foo::new_u32(123); 
    let b = Foo::new_i32(123); 
    println!("{}", a == b); 
} 

出力:

false 

https://play.rust-lang.org/?gist=51166880a9ab0c49d7650588c4ed8290&version=stable&backtrace=0

関連する問題