96SEO 2026-09-02 21:30 4
在开发过程中。我们总会遇到“判断两个对象是否相等”的场景,比如比较两个变量的值、在集合中查找目标元素、去重等。与其他编程语言不同,默认就支持对象的相等判断。Rust 需要用到 PartialEq 与 Eq 这两个特征来判断是否相等。为什么 Rust 要搞这么复杂?今天我们一起来聊一聊,Rust 判断对象相等的根本原因。还有这两个主要特征的使用方法,帮你一次性搞懂。
为什么其他语言能默认实现相等判断,Rust 却不行?答案很简单,那就是:“相等”的语义。从来都不是固定的。

如果 Rust 像其他语言那样。默认实现“所有字段都相等才算对象相等”,那在只需要比较部分字段的场景里我们就得额外写代码覆盖默认逻辑,反而更麻烦。说起来,Rust 选择了更严谨的方式:不提供默认的相等判断。而是通过 PartialEq 和 Eq 两个特征,让我们根据自己的业务场景自定义“相等”的规则。按理说,
这两个特征是 Rust 判断对象相等的主要。二者是“继承关系”,但语义上有明显区别。我们一个个来聊,先从最常用的 PartialEq 开始。
PartialEq 翻译过来是“部分相等”。它的作用很简单:定义两个对象“在某种程度上”是否相等,支持我们使用 == 和 != 这两个运算符比较一下。
pub trait PartialEq {
// 判断 self 和 or 是否相等
fn eq -> bool;// 判断是否不相等,默认是 eq 方法取反
fn ne -> bool {
self.eq
}
}
从定义能看出来只要我们实现了 eq 方法。就可以直接用 ==来比较对象了。
痛点1:很多新手误以为实现了 equals/`cmp`** 就能直接使用 `==`,实际只有实现了 `PartialEq` 才会让编译器把 `==` “解包”为 `eq` 调用。
那为什么叫“部分相等”呢?主要是它不要求满足“自反性”. 简单说就是存在某个值 a,使得 a == a` 的结果是 `
典型案例——浮点数 NaN:
fn main {
let nan = f32::NAN;println,;// 输出:false
}
正因为浮点数存在这种“自己不等于自己”的情况。所以 Rust 只为浮点数默认实现了 PartialEq,而没有实现 E q 。这也正是 “ 部分 相 等 ” 的主要含义:不是所有值都能和自己相 等。
在 讲 完 了 Partial Eq 后,再 看 Eq。它 翻译过 来 是 “ 完全 相 等 ”,是 在 Partial Eq 的 基础 上,增 加 了 更 强 的 契约约束 . 它 的 定义 更 简 单,甚至 没有 附加 方法,只是 继 承 了 Partial Eq :
pub trait Eq: PartialEq { // 没有额外方法。仅仅是一个 “契约标记” }
虽然没有额外方法,但 Eq 有 三 个 必须 满足 的 契约:
哪些 类型 实现了 Eq?我们 平时 使用 的 基础 类型,比如 i32 、 bool 、 String 、 Vec 等,都 实现了 Eq,因为 它们 均 满足 上 面 的 三 个 契约 . 而 浮点 数 因 为 存 在 NaN,无法 满 足 自反 性,所以 不 能 实现 Eq .
如果 自 定义 类型 中,所有 字段 都 实现了 Partial Eq 或 Eq。那 我们 根本 不 用 手动 写代码,只需要 在 类型 定义 前 添加 上 派生 宏,Rust 就 会 自动 帮 我们 实现 相 等 判断 逻辑 . 这种 方 式适 合 大 多数 场 景,简 单 又 不 容易 出 错 .
// 自动派生 PartialEq 和 Eq
#
struct Point {
x: i32,y: i32,}
fn main {
let p1 = Point { x: 1,y: 2 };let p2 = Point { x: 1,y: 2 };let p3 = Point { x: 2,y: 3 };怎么说呢,println!,// 输出:true
println!,// 输出:false
}
如果 自动 派 生 的 逻辑 不 符 合 我们 的需求,那 就 必 须 手 动 实现 Partial_eq,自己 定义 eq 方法 的 判定 logic .
示例 : 当 圆形 半径 相 同 即 被视 为 相 同 圆形 .
#
struct Circle {
radius这方面。f64,x: f64,y: f64,}
// 手动实现 PartialEq
impl PartialEq for Circle {
fn eq -> bool {
// 只比较半径,忽略圆心坐标
self.radius == or.radius
}
}
fn main {
let c1 = Circle { radius: 5.0,x:0.0,y:0.0 };let c2 = Circle { radius:5.0。x:10.0,y:-10.0 };println,;
// 输出:true
}
聊 完了 Partial_eq 和 Eq,还有 一个 新 手 很 容易 踩 坑 的 点 : Rust 中 的 “ 值 相 等 ” 和 “ 引 用 相 等 ” 到底 不 一 样?老实说,简 单 来说 :
我们 平时 用 ``==`` 比 较 的 都 是 值 相 等;要 判断 引 用 相 等 则 使用 ``std::ptr::eq`` 函数 . 示例 :
use std::ptr;fn main {
let a = 5;let b =5,let ref_a =&a;// 指向 a 的引用
let ref_b =&b;// 指向 b 的引用
let ref_a2 =&a;//
指向 a
// 值相等:ref_a 和 ref_b 指向的内容都是5,所以认为值相等
println!,// true
// 引用相等:ref_a 指向 a。ref_b 指向 b,内存地址不同
println!: {}",ptr::eq);// false
// ref_a 与 ref_a2 指向同一个地址
println!: {}",ptr::eq);话说回来,// true
}
: 很多人误把 ``==`` 当作指针比较。一旦涉及智能指针 就会产生 subtle bug。记住这方面,值比较走 ``Partial_eq/Eq``;指针比较走 ``ptr::eq`` 或对应智能指针专属 API。
use std::sync::Arc;fn main {
let a = Arc::new;let b = Arc::clone;let c = Arc::new;assert,);// true,同一块堆内存
assert!),// false,不同分配
}
虽然 ``Partial_eq`` 更通用。但有些场景必须使用 ``E q``,最典型的就是 ``HashMap
use std::collections::HashMap;老实说,fn main {
let mut map: HashMap=HashMap::new;map.insert,// 编译错误:f32 未实现 E q
}
手动实现时一定要遵守对称性、传递性,否则逻辑错误难以被编译器捕获。例如只为 A 实现 B 的比较,而未为 B 实现 A:
# struct A;# struct B,impl PartialEq for A {
fn eq -> bool {
self.0 == or.0 + 1
}
}
fn main {
let a=A;let b=B,println!,// true
// b==a 编译错误,因为没有对应 impl
}
E q 时忽略字段的 E q 实现
rust // 编译报错:f64 未实现 E q。无⎔⎔⎔⎔⎔⎔⎔⎔⎔⎔ ⓘ ⓘ ⓘ ⓘ ⓘ ⓘ ⓘ
struct Circle{ radius:f64,x:i32,y:i32 }
解决办法要想派生 E q,需要确保所有成员也都满足 E q;怎么说呢,否则只能只派生 Part ial_eq 并自行决定是否提供自定义 E q。
掌握好 `P artialEQ ` 与 `
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback