rust语言学习笔记Trait(九)PartialEq、 Eq(相等比较)

发布时间:2026/5/23 7:32:21

rust语言学习笔记Trait(九)PartialEq、 Eq(相等比较) 1. 核心定义与区别PartialEq部分等价关系‌定义‌允许某些值不与自身相等。‌核心方法‌fn eq(self, other: Rhs) - bool和fn ne(self, other: Rhs) - bool。‌典型场景‌浮点数 (f32,f64)。因为NaN ! NaN所以浮点数只能实现PartialEq不能实现Eq。f64::NAN ! f64::NAN‌数学性质‌满足对称性若 ab 则 ba和传递性若 ab 且 bc 则 ac但‌不要求自反性‌aa 不一定成立。Eq完全等价关系‌定义‌标记 TraitMarker Trait没有方法。它依赖于PartialEq并承诺满足自反性。‌核心约束‌对于所有aa a必须返回true。‌典型场景‌整数、字符串、布尔值、结构体如果其所有字段都实现了Eq。‌作用‌作为类型系统的约束确保该类型可以用于需要严格相等性的场景如HashMap的键、BTreeSet等。HashMap的键必须实现Eq以及Hash在编译期就阻止了使用f32/f64作为键从而避免了这类运行时 bug。2、自定义结构体派生PartialEq、Equsestd::collections::HashMap;// 子类型有浮点类型不能派生 Eq// 因为 f32 没有实现 Eq#[derive(Debug, PartialEq)]structPoint{x:f32,y:f32,}#[derive(Debug, PartialEq, Eq, Hash)]structUser{name:String,// String 实现了 Eqage:i32,// i32 实现了 Eq}fnmain(){letp1Point{x:1.2,y:5.6};letp2Point{x:1.2,y:5.6};println!({},p1p2);// trueletu1User{name:String::from(Jane),age:18};letu2User{name:String::from(Jane),age:18};println!({},u1u2);// trueletmuthmHashMap::new();hm.insert(u1,Jjjj);// 实现了PartialEq, Eq, Hash可以做键println!({:?},hm.get(u2));// Some(Jjjj)}3、自定义类型手动实现PartialEq、Eq// 自定义类型structMyStr(String);// 实现 PartialEqimplPartialEqforMyStr{// 实现 eq 方法fneq(self,other:Self)-bool{self.0.to_lowercase()other.0.to_lowercase()// 转换为小写}}// 实现 Eq// Eq 是一个标记 Trait没有任何方法// 只需写下面这句代码implEqforMyStr{}fnmain(){letms1MyStr(String::from(Hello));letms2MyStr(String::from(heLLo));println!({},ms1ms2);// true忽略大小写进行比较}ne方法不等于通常不需要手动实现ne不等于。PartialEqtrait 提供了默认的ne实现fnne(self,other:Rhs)-bool{!self.eq(other)}除非你有性能优化的特殊需求例如可以直接判断不相等而无需完整比较否则省略它即可。4、自定义结构体手动实现PartialEq、Eq只比较部分属性// 自定义类型structMyStruct{name:String,age:u8,time:u64,}// 实现 PartialEqimplPartialEqforMyStruct{fneq(self,other:Self)-bool{self.nameother.nameself.ageother.age// 不比较time}}// 实现 EqimplEqforMyStruct{}fnmain(){letms1MyStruct{name:String::from(小刚),age:18,time:33};letms2MyStruct{name:String::from(小刚),age:18,time:65};println!({},ms1ms2);// true}

相关新闻