需要实现比较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
只能比较相同 types。
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中的完整代码
问题是特质
PartialEq
只能比较相同 types。
那不是真的。它只是将Rhs
默认为与Self
相同的类型:
pub trait PartialEq<Rhs = Self> where Rhs: ?Sized {
...
}
这是您将如何实现PartialEq
的CC_7和任何R
和CC_11的Foo<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=511666888880A9AB0C49D76505888C4ED8290&Amp; version = stable&ambbacktrace&backtrace; backtrace = 0