当前位置:首页 > 科技  > 软件

Rust中的Eq和PartialEq详解与实践

来源: 责编: 时间:2024-04-11 09:05:38 274观看
导读在Rust编程语言中,为了重载操作符,我们需要实现相应的trait(特征)。比如为了使用比较运算符<、<=、>和>=,你需要实现PartialOrd特征。如果你希望使用加号+,则需要实现std::ops::Add特征。本文将详细讨论Eq和PartialEq特征,这

在Rust编程语言中,为了重载操作符,我们需要实现相应的trait(特征)。比如为了使用比较运算符<、<=、>和>=,你需要实现PartialOrd特征。如果你希望使用加号+,则需要实现std::ops::Add特征。本文将详细讨论Eq和PartialEq特征,这两个特征分别用于实现==和!=操作符,我们将深入探讨它们的区别,并提供实用的示例。niB28资讯网——每日最新资讯28at.com

何为Eq和PartialEq?

Rust中的Eq和PartialEq是用于比较操作的两个核心trait。如果你的类型需要支持相等性比较(即可以使用==和!=操作符进行比较),它们必须实现这两个trait中的至少一个。 这两者之间的主要区别在于"偏序性"(Partial)和"全序性"(Full)。PartialEq允许类型的部分值相互比较,而Eq要求类型的所有值在比较时都是确定的。niB28资讯网——每日最新资讯28at.com

PartialEq的实现

首先,让我们来看一个PartialEq的例子:niB28资讯网——每日最新资讯28at.com

enum BookFormat { Paperback, Hardback, Ebook }struct Book {    isbn: i32,    format: BookFormat,}impl PartialEq for Book {    fn eq(&self, other: &Self) -> bool {        self.isbn == other.isbn    }}impl Eq for Book {}

这里Book结构体实现了PartialEq,但它也能够自动获得Eq的默认实现(没有额外的行为需要定义)。niB28资讯网——每日最新资讯28at.com

部分相等性 Partial Eq

浮点数类型f32和f64默认实现了PartialEq而非Eq。这是因为浮点数涉及一个特殊的值:NaN(不是一个数),NaN不与任何值(包括它自己)相等,这违反了Eq需要的全部相等性:niB28资讯网——每日最新资讯28at.com

let f1 = f32::NAN;let f2 = f32::NAN;if f1 == f2 {    println!("NaN 竟然可以比较,这很不数学啊!");} else {    println!("果然,虽然两个都是 NaN ,但是它们其实并不相等");}

在这段代码中,输出将会是"果然,虽然两个都是 NaN ,但是它们其实并不相等"。niB28资讯网——每日最新资讯28at.com

Ord与PartialOrd

类似于Eq和PartialEq,Ord和PartialOrd是另外一对重要的trait,它们分别用于全序比较和偏序比较。这意味着,实现Ord的类型其值必须能够进行全序排序,而实现PartialOrd的类型则只能保证局部的顺序关系。niB28资讯网——每日最新资讯28at.com

让我们看一个例子:niB28资讯网——每日最新资讯28at.com

use std::fmt::Display;struct Pair<T> {    x: T,    y: T,}impl<T: Display+PartialOrd> Pair<T> {    fn cmp_display(&self) {        if self.x >= self.y {            println!("The largest member is x = {}", self.x);        } else {            println!("The largest member is y = {}", self.y);        }    }}

在这个例子中,我们定义了一个Pair<T>结构,该结构的两个字段x和y都为泛型类型T。我们在此结构中实现Display和PartialOrd来比较这两个字段的值。niB28资讯网——每日最新资讯28at.com

结论

理解和合理使用Eq和PartialEq特征对于实现类型比较操作至关重要。在设计你自己的类型时,如果所有实例之间都是可以比较的,那么可以选择实现Eq;否则,如果类型存在无法比较的特殊值(例如浮点数的NaN),则仅实现PartialEq即可。niB28资讯网——每日最新资讯28at.com

每当我们定义比较行为时,无论是基于性能考虑还是逻辑要求,我们都应该仔细选择正确的特征来实现。希望以上内容有助于你更好地理解和利用Rust语言的这一特性。niB28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-82757-0.htmlRust中的Eq和PartialEq详解与实践

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 起飞了,Rust 构建 Spin 微服务框架,毫秒级的冷启动!

下一篇: WPF 和 WinForms 关于句柄使用的区别

标签:
  • 热门焦点
  • MIX Fold3包装盒泄露 新机本月登场

    小米的全新折叠屏旗舰MIX Fold3将于本月发布,近日该机的真机包装盒在网上泄露。从图上来看,新的MIX Fold3包装盒在外观设计方面延续了之前的方案,变化不大,这也是目前小米旗舰
  • 中兴AX5400Pro+上手体验:再升级 双2.5G网口+USB 3.0这次全都有

    2021年11月的时候,中兴先后发布了两款路由器产品,中兴AX5400和中兴AX5400 Pro,从产品命名上就不难看出这是隶属于同一系列的,但在外观设计上这两款产品可以说是完全没一点关系
  • 石头智能洗地机A10 Plus体验:双向自清洁治好了我的懒癌

    一、前言和介绍专为家庭请假懒人而生的石头科技在近日又带来了自己的全新旗舰新品,石头智能洗地机A10 Plus。从这个产品名上就不难看出,这次石头推出的并不是常见的扫地机器
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 如何通过Python线程池实现异步编程?

    线程池的概念和基本原理线程池是一种并发处理机制,它可以在程序启动时创建一组线程,并将它们置于等待任务的状态。当任务到达时,线程池中的某个线程会被唤醒并执行任务,执行完任
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了&mdash;&mdash;贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 世界人工智能大会国际日开幕式活动在世博展览馆开启

    30日上午,世界人工智能大会国际日开幕式活动在世博展览馆开启,聚集国际城市代表、重量级院士专家、国际创新企业代表,共同打造人工智能交流平台。上海市副市
  • 中关村论坛11月25日开幕,15位诺奖级大咖将发表演讲

    11月18日,记者从2022中关村论坛新闻发布会上获悉,中关村论坛将于11月25至30日在京举行。本届中关村论坛由科学技术部、国家发展改革委、工业和信息化部、国务
Top