比较`Foo <i32>`和`Foo <u32>`

时间:2016-06-15 07:38:54

标签: compare rust equality

需要意识到比较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

中的完整代码

1 个答案:

答案 0 :(得分:4)

  

问题是特质PartialEq只能比较相同的类型。

那不是真的。它只是将Rhs默认为与Self相同的类型:

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

以下是对PartialEqFoo<L> Foo<R>L实施R的方法:

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