比较"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只能比较相同 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

相关内容

  • 没有找到相关文章

最新更新