发布时间:2026/7/24 22:45:03
【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。

相关新闻

2026/7/24 22:40:03

本地大模型Ollama实战:MES工程师的私有知识库搭建指南

一、问题背景:为什么FAB工艺工程师需要本地大模型作为FAB的工艺工程师,每天的工作几乎都离不开“查资料”这三个字。清晨到岗,先要看昨夜的异常批次处置记录;做工艺变更,要翻SOP确认参数窗口;设备报警&…

2026/7/24 22:40:03

半导体数字孪生实战:从FAB物理模型到虚拟镜像的全链路搭建

一、问题背景:百亿投资下的试产风险建设一座现代化的晶圆厂,动辄需要投入上百亿资金。厂房、洁净室、动力设施与成套的工艺设备构成了庞大的固定资产,而其中最昂贵、最精密的部分正是那些用于刻蚀、薄膜沉积与光刻的核心设备。当这些设备安装…

2026/7/25 0:15:28

Wand-Enhancer完整指南:3步解锁WeMod专业版功能

Wand-Enhancer完整指南:3步解锁WeMod专业版功能 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer Wand-Enhancer是一款专为WeMod游戏修改…

2026/7/25 0:15:28

3分钟学会Chrome完整网页截图:终极免费解决方案

3分钟学会Chrome完整网页截图:终极免费解决方案 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-chrome-extension …

2026/7/25 0:10:27

告别网盘限速!九大主流网盘直链下载神器LinkSwift完整指南

告别网盘限速!九大主流网盘直链下载神器LinkSwift完整指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / …

2026/7/23 12:54:51

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述:为什么我们需要一个本地通信服务器?在游戏开发、数字孪生、仿真训练等众多领域,Unity作为强大的实时3D内容创作平台,其核心逻辑通常由C#驱动。然而,当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/25 0:00:15

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:00:15

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:00:15

VHF 甚高频语音喊话系统(桥梁智能防撞场景)核心优势

一、直达船员,预警链路最短营运船舶强制标配 VHF 船载电台,属于驾驶室常态化值守设备;预警语音直接传递至驾驶人员,区别于岸上声光报警(船员经常听不到)、短信 / 小程序(船员极少主动查看&#…

2026/7/23 23:42:43

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…