【Rust中级教程】2.2. API设计原则之不意外性(unsurprising) Pt.2:实现Clone、Default、PartialEq、PartialOrd、Hash、Eq和Ord
2.2. API设计原则之不意外性(unsurprising) Pt.2实现Clone、Default、PartialEq、PartialOrd、Hash、Eq和Ord2.2.1. 建议实现Clonetrait和DefaulttraitClonetraitRust的Clonetrait允许实现者通过clone方法显式创建自身的深拷贝以区别于Copytrait提供的按值复制。看一个Clone例子#[derive(Debug, Clone)] struct Person { name: String, age: u32, } impl Person { fn new(name: String, age: u32) - Self { Self { name, age } } } fn main() { let person1 Person::new(John.to_owned(), 25); let person2 person1.clone(); println!({:?}, person1); println!({:?}, person2); }Person这个结构体实现了Clonetrait主函数中person2克隆了person1的数据因为它实现了Clone输出Person { name: John, age: 25 } Person { name: John, age: 25 }DefaulttraitRust的Defaulttrait允许类型定义一个默认值通过default()方法返回该类型的默认实例。看一个Default的例子#[derive(Default)] struct Point { x: i32, y: i32, } fn main() { let p Point::default(); println!(Point is at ({}, {}), p.x, p.y); }输出Point is at (0, 0)2.2.2. 建议实现PartialEq、PartialOrd、Hash、Eq和OrdtraitPartialEqtraitPartialEq提供和!操作符支持允许自定义类型进行部分相等性比较看个例子#[derive(Debug, PartialEq)] struct Point { x: i32, y: i32, } fn main() { let point1: Point Point { x: 1, y: 2 }; let point2: Point Point { x: 1, y: 2 }; let point3: Point Point { x: 3, y: 4 }; println!(point1 point2: {}, point1 point2); println!(point1 point3: {}, point1 point3); }通过实现PartialEq我们就可以实现比较结构体是否相等的操作输出point1 point2: true point1 point3: falsePartialOrd、PartialEq、Eq、OrdtraitPartialOrd提供、、和操作符支持允许自定义类型进行部分排序比较可能存在无法比较的情况Eq是PartialEq的更严格版本要求相等性满足自反性a a总是true。实现Eq必须要先实现PartialEq。Ord是PartialOrd的更严格版本要求实现全序关系使类型支持完整的排序逻辑如BTreeMap、BTreeSet 。实现Ord必须要先实现PartialOrd。看个例子use std::collections::BTreeMap; #[derive(Debug, PartialEq, PartialOrd, Eq, Ord, Clone)] struct Person { name: String, age: u32, } fn main() { let mut ages BTreeMap::new(); let person1 Person { name: String::from(Alice), age: 25, }; let person2 Person { name: String::from(Bob), age: 30, }; let person3 Person { name: String::from(Charlie), age: 20, }; ages.insert(person1.clone(), Alices Age); ages.insert(person2.clone(), Bobs Age); ages.insert(person3.clone(), Charlies Age); for (person, description) in ages { println!({}: {} - {:?}, person.name, person.age, description); } }BTreeMap实现了有序存储。它需要根据键的值来排序所以它要求键类型必须实现了Ord全局比较用于排序和Eq用于判断键是否相等。实现Ord又需要先实现PartialOrd实现Eq有需要先实现PartialEqHashtraitHash允许类型实现hash()方法以支持HashMap、HashSet等哈希集合。Hashtrait 本身并不以Eq为超 trait但哈希集合要求K: Eq Hash且相等的值必须产生相同的哈希。所以在实践中只要类型会用作哈希表/集合的键就应一并实现PartialEq和Eq。看个例子use std::collections::HashSet; use std::hash::{Hash, Hasher}; #[derive(Debug, PartialEq, Eq, Clone)] struct Person { name: String, age: u32, } impl Hash for Person { fn hashH: Hasher(self, state: mut H) { self.name.hash(state); self.age.hash(state); } } fn main() { let mut persons HashSet::new(); let person1 Person { name: Alice.to_string(), age: 25, }; let person2 Person { name: Bob.to_string(), age: 30, }; let person3 Person { name: Charlie.to_string(), age: 20, }; persons.insert(person1.clone()); persons.insert(person2.clone()); persons.insert(person3.clone()); println!(Persons: {:#?}, persons); }HashSet用于存储唯一的元素集合而HashMap用于存储键值对。输出Persons: { Person { name: Bob, age: 30, }, Person { name: Charlie, age: 20, }, Person { name: Alice, age: 25, }, }Eq与PartialEq、Ord与PartialOrdEq相对于PartialEq、Ord相对于PartialOrd都有额外的语义要求。只应在这些语义适用你的类型时才实现它们。我们看一下Eq相对于PartialEq的额外语义-自反性Reflexivity对于所有a必须有a a恒成立PartialEq本身已要求对称性和传递性Eq是“相等性也自反”的标记因此不存在诸如f32::NAN ! f32::NAN这类“部分相等”。我们看一下Ord相对于PartialOrd的额外语义-全序 / 可比性对所有a和ba b、a b、a b恰好成立其一等价地partial_cmp从不返回None-自反性Reflexivity对于所有a必须有a a和a a恒成立。-反对称性Antisymmetry如果a b且b a则必须保证a b。-传递性Transitivity如果a b且b c则必须保证a c。

相关新闻

Windows系统安装与卸载OpenClaw远程控制工具指南

Windows系统安装与卸载OpenClaw远程控制工具指南

1. 项目概述OpenClaw是一款开源的远程控制工具,主要用于系统管理、远程协助等场景。作为一名经常需要远程维护多台Windows设备的技术支持人员,我发现OpenClaw在跨平台兼容性和功能完整性方面表现优异。本文将详细介绍在Windows系统上安装和卸载OpenClaw的…

2026/7/24 22:44:03 阅读更多 →
癌细胞善于“隐身逃逸”?肿瘤免疫疗法,精准击破肿瘤防御体系

癌细胞善于“隐身逃逸”?肿瘤免疫疗法,精准击破肿瘤防御体系

在肿瘤治疗领域,手术、放疗、化疗是传统的三大核心手段,能够快速清除实体病灶、遏制肿瘤增殖,但普遍存在靶向性弱、毒副作用大、易复发耐药等短板。随着肿瘤学与免疫学的交叉发展,肿瘤免疫治疗强势崛起,被业界誉为癌症…

2026/7/24 22:44:03 阅读更多 →
从调试失败到生产就绪:扣子API调用全流程排障手册,含Postman/Python/cURL三套可复用脚本

从调试失败到生产就绪:扣子API调用全流程排障手册,含Postman/Python/cURL三套可复用脚本

更多请点击: https://codechina.net 第一章:从调试失败到生产就绪:扣子API调用全流程排障手册,含Postman/Python/cURL三套可复用脚本 核心排障路径:四层验证法 在调用扣子(Coze)平台API时&…

2026/7/24 22:44:03 阅读更多 →

最新新闻

Veeam备份虚拟机报错Unable to allocate RAM for VM snapshot完整解决方案

Veeam备份虚拟机报错Unable to allocate RAM for VM snapshot完整解决方案

Veeam执行虚拟机备份时抛出Unable to allocate RAM for VM snapshot报错,核心根源是ESXi宿主机可用物理内存不足;Veeam备份依赖VMware快照捕获虚拟机内存状态,创建内存快照时ESXi需要预留出与虚拟机已分配内存容量完全对等的空闲RAM资源&…

2026/7/24 22:54:07 阅读更多 →
「盘点」界面控件DevExtreme (v23.1, v23.2)可访问性增强

「盘点」界面控件DevExtreme (v23.1, v23.2)可访问性增强

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NET Core,jQuery,Knockout等)构建交互式的Web应用程序。从Angular和Reac&#xff0c…

2026/7/24 22:54:07 阅读更多 →
【研发类-区块链开发Skills】nft-standards 技能

【研发类-区块链开发Skills】nft-standards 技能

掌握ERC-721和ERC-1155 NFT标准、元数据最佳实践和高级NFT功能。 技能概述 nft-standards 技能是一个专门用于NFT开发的技能,涵盖ERC-721和ERC-1155 NFT标准、元数据最佳实践和高级NFT功能。该技能为开发者提供创建NFT收藏、实现市场功能、构建链上或链下元数据、创建灵魂绑定…

2026/7/24 22:54:07 阅读更多 →
太好了,千问向新人发放8元通用立减券,附专属口令:千问新人福利vVyOnx,亲测可用!

太好了,千问向新人发放8元通用立减券,附专属口令:千问新人福利vVyOnx,亲测可用!

最近整理了通义千问新用户得福利的小技巧,把最新的信息分享给大家:操作步骤先在手机应用商店找到千问APP,用之前没用过它的手机号注册登录;跟着APP 里的指引绑定支付宝账号,这一步是拿到福利和抵扣的必要环节&#xff…

2026/7/24 22:54:07 阅读更多 →
终极解决方案:用mytv-android让老旧智能电视重获新生,免费享受流畅直播体验

终极解决方案:用mytv-android让老旧智能电视重获新生,免费享受流畅直播体验

终极解决方案:用mytv-android让老旧智能电视重获新生,免费享受流畅直播体验 【免费下载链接】mytv-android 使用Android原生开发的视频播放软件 项目地址: https://gitcode.com/gh_mirrors/my/mytv-android 你是否还在为家中那台"老古董&quo…

2026/7/24 22:54:07 阅读更多 →
【LangGraph实战】《LangGraph实战》_45.[第3章 状态图结构] 递归限制:防止智能体陷入无限循环的安全阀

【LangGraph实战】《LangGraph实战》_45.[第3章 状态图结构] 递归限制:防止智能体陷入无限循环的安全阀

你的Agent不是“深思熟虑”,而是在“死循环”里原地转圈!LangGraph递归限制:那道阻止AI烧光你钱包、撑爆你服务器、让你在凌晨三点被报警电话惊醒的终极安全阀。很多人学了节点编排、边连接,却唯独忽略了这个藏在config里的“救命…

2026/7/24 22:53:07 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻