【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/10/25 4:47:48 阅读更多 →
癌细胞善于“隐身逃逸”?肿瘤免疫疗法,精准击破肿瘤防御体系

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

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

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

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

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

2026/10/25 17:57:23 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/30 0:01:36 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/29 8:45:01 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/29 9:52:56 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/30 0:01:37 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/29 9:51:34 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/29 8:44:28 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/29 17:01:10 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/29 9:42:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/30 0:01:33 阅读更多 →