需要意识到比较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);
中的完整代码
答案 0 :(得分:4)
问题是特质
PartialEq
只能比较相同的类型。
那不是真的。它只是将Rhs
默认为与Self
相同的类型:
pub trait PartialEq<Rhs = Self> where Rhs: ?Sized {
...
}
以下是对PartialEq
和Foo<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