如何为不同类型实现PartialEq?能否像Python__eq__那样重载相等判断?
Rust跨枚举类型实现PartialEq的问题
我想要为两个不同的枚举类型A和B实现PartialEq trait,使A的某个成员与B的某个成员相等,编写了如下代码:
impl PartialEq for A { fn eq(&self, other: &B) -> bool { match (self, other) { ... } } }
但出现了错误提示:
change the parameter type to match the trait: `&EventType`
请问该如何解决这个问题?是否可以像Python的__eq__那样对任意两个类型重载相等判断?
问题根源
Rust标准库的PartialEq trait默认定义的是同类型的相等比较,eq方法的参数固定是&Self(和当前实现类型相同的引用)。你直接把参数改成&B,完全不符合trait的签名要求,所以编译器报错要求你改回匹配的类型。
正确实现方式
要实现不同类型间的相等判断,得明确指定要和哪个类型比较,也就是为PartialEq<B>实现到A上。举个具体的例子:
假设我们有两个枚举:
enum A { Foo(i32), Bar, } enum B { Baz(i32), Qux, }
实现A与B的相等判断
// 支持 A == B 的写法 impl PartialEq<B> for A { fn eq(&self, other: &B) -> bool { match (self, other) { (A::Foo(num_a), B::Baz(num_b)) => num_a == num_b, // 其他组合都不相等 _ => false, } } }
可选:实现对称相等(B == A)
如果需要支持B == A的写法,可以复用上面的实现,避免重复逻辑:
impl PartialEq<A> for B { fn eq(&self, other: &A) -> bool { other.eq(self) } }
这样就能正常进行跨枚举类型的相等判断了,比如A::Foo(10) == B::Baz(10)会返回true,其他组合返回false。
和Python __eq__的区别
Rust不像Python那样允许__eq__接受任意类型参数,因为Rust是静态类型语言,所有类型都要在编译期确定。但通过为需要比较的每一对类型实现PartialEq<T>,同样能实现跨类型相等判断的效果——只要你为用到的类型对都做对应的实现就行。
内容的提问来源于stack exchange,提问作者AARMN
相关产品推荐
相关产品推荐

