当前位置: 首页 > news >正文

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}
http://www.gsyq.cn/news/1353818.html

相关文章:

  • 轻薄本秒变高配工作站,向日葵升级“高性能版”,设计、剪辑更顺手!
  • ZU+ MPSoC 8颗DDR4大内存子系统硬件设计实战与信号完整性解析
  • 极限编程XP
  • Linux文件操作实战:find、grep、tar命令组合应用与避坑指南
  • 宁德市2026黄金回收本地口碑商家榜:黄金首饰+ 白银+ 铂金+ 彩金回收门店及联系方式推荐 - 盛世金银回收
  • QQ音乐加密音频技术解析:qmcdump解密工具深度指南与专业实践
  • [特殊字符] Java GC机制详解:G1、ZGC、Shenandoah全面解析与版本演进对比
  • matplotlib的Figure画布管理
  • LaCT架构解析:混合窗口注意力与长序列建模的创新融合
  • RT-Thread全局中断操作:原理、应用与低功耗设计关键
  • 荆州市2026黄金回收本地口碑商家榜:黄金首饰+ 白银+ 铂金+ 彩金回收门店及联系方式推荐 - 盛世金银回收
  • ESP32/ESP8266固件备份全攻略:esptool与flash_download_tool实战详解
  • 2026年GEO生成引擎优化:当AI成为信息入口,品牌如何抢占新流量高地?
  • DownKyi终极教程:轻松下载B站8K超高清视频的完整指南
  • 极致优化:Agent响应延迟从十秒压缩到一秒的全过程
  • 数字芯片RTL设计核心原则与实践:从可综合性到时序收敛
  • 国产工控机选型实战:从自主可控到边缘智能的工业应用解析
  • 九江市2026黄金回收本地口碑商家榜:黄金首饰+ 白银+ 铂金+ 彩金回收门店及联系方式推荐 - 盛世金银回收
  • 酒泉市2026黄金回收本地口碑商家榜:黄金首饰+ 白银+ 铂金+ 彩金回收门店及联系方式推荐 - 盛世金银回收
  • Linux IIO驱动开发:从通道、触发到Buffer的实战解析
  • 蚌埠市2026黄金回收本地口碑商家榜:黄金首饰+ 白银+ 铂金+ 彩金回收门店及联系方式推荐 - 盛世金银回收
  • 安阳市2026黄金回收本地口碑商家榜:黄金首饰+ 白银+ 铂金+ 彩金回收门店及联系方式推荐 - 盛世金银回收
  • NTC与PTC热敏电阻选型实战:从原理到电路设计的深度解析
  • Armv8-A架构深度解析:从64位指令集到虚拟化与安全扩展
  • 达州市2026黄金回收本地口碑商家榜:黄金首饰+ 白银+ 铂金+ 彩金回收门店及联系方式推荐 - 盛世金银回收
  • 宝鸡市2026黄金回收本地口碑商家榜:黄金首饰+ 白银+ 铂金+ 彩金回收门店及联系方式推荐 - 盛世金银回收
  • 从零实现一个轻量级向量搜索引擎(Python 版)
  • 巴中市2026黄金回收本地口碑商家榜:黄金首饰+ 白银+ 铂金+ 彩金回收门店及联系方式推荐 - 盛世金银回收
  • 物联网网关操作系统映像的标准化保存与自动化部署实践
  • 工业电伴热系统安全防护:微型热保护器选型、安装与维护全解析