服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - 编程技术 - Rust中的Eq和PartialEq详解与实践

Rust中的Eq和PartialEq详解与实践

2024-04-10 15:23Rust开发笔记 编程技术

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

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

何为Eq和PartialEq?

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

PartialEq的实现

首先,让我们来看一个PartialEq的例子:

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的默认实现(没有额外的行为需要定义)。

部分相等性 Partial Eq

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

let f1 = f32::NAN;
let f2 = f32::NAN;

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

在这段代码中,输出将会是"果然,虽然两个都是 NaN ,但是它们其实并不相等"。

Ord与PartialOrd

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

让我们看一个例子:

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来比较这两个字段的值。

结论

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

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

原文地址:https://mp.weixin.qq.com/s/oGMlqKdW0HBD6snF2MlFUw

延伸 · 阅读

精彩推荐
  • 编程技术OpenHarmony继续上云之腾讯云平台

    OpenHarmony继续上云之腾讯云平台

    说实话,腾讯云物联网平台一直是我比较喜欢的物联网云太平,除了有腾讯大厂作为品质背书之外,提供的sdk也是相当好用,更有腾讯连连小程序可以帮助做界面...

    鸿蒙社区4792021-12-30
  • 编程技术新一代数据架构的性能与成本平衡之道

    新一代数据架构的性能与成本平衡之道

    今天分享的主题是 Alluxio Local Cache 在 Presto 和 S3 上的实践,属于 Alluxio 的中间部分。NewsBreak 是美国的一家新闻资讯企业。文章将通过该公司案例,介绍Al...

    DataFunTalk11312024-03-04
  • 编程技术OSPF路由协议详解

    OSPF路由协议详解

    这篇文章主要介绍了OSPF路由协议,OSFP是基于开放标准的链路状态路由选择协议,它完成各路由选择协议算法的两大主要功能:路径选择和路径交换。对此...

    大阿鹏2162020-07-16
  • 编程技术一些不好记却很好用的 CSS 属性

    一些不好记却很好用的 CSS 属性

    本文介绍一些我觉得不太好记但是却很好用的 CSS 属性,也是顺便帮自己做个笔记。...

    前端先锋5142021-04-25
  • 编程技术用 Lua 操作文件中的数据

    用 Lua 操作文件中的数据

    当你编程时,无论是简单的脚本还是复杂的工具套件,通常都需要读取和写入文件。有时文件可能包含配置选项,而另一些时候这个文件是你的用户用你的...

    Linux中国4212021-04-05
  • 编程技术页面白屏了?看看可选链操作符(?.)

    页面白屏了?看看可选链操作符(?.)

    可选链操作符(?.)允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。...

    前端皮小蛋7162021-05-20
  • 编程技术VSCode各语言运行环境配置方法示例详解

    VSCode各语言运行环境配置方法示例详解

    这篇文章主要介绍了VSCode各语言运行环境配置方法,本文通过实例代码给大家介绍的非常详细,对大家介绍的学习或工作具有一定的参考借鉴价值,需要的朋...

    Keine Zeit4152020-09-12
  • 编程技术深入理解浏览器的各种刷新规则

    深入理解浏览器的各种刷新规则

    这篇文章给大家详细介绍了PC浏览器的刷新方式,以及简单的介绍了WISE浏览器的刷新方式,文章介绍的很详细,有需要的朋友们可以一起来看看吧。...

    蛋炒饭3232020-08-06