gpt4 book ai didi

比较 `Foo` 和 `Foo`

转载 作者:行者123 更新时间:2023-11-29 08:23:55 24 4
gpt4 key购买 nike

需要实现比较的可能性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
}
}
}

问题是 trait 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

最佳答案

The problem is that trait PartialEq can only compare the same types.

那不是真的。它只是默认 RhsSelf 相同的类型:

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

以下是您将如何实现 PartialEq对于 Foo<L>Foo<R>对于任何 LR :

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

请注意,我还必须更改 impl block 来修复一些类型推断错误。最终代码:

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

关于比较 `Foo<i32>` 和 `Foo<u32>`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37829012/

24 4 0