rust学习-trait std::cmp::PartialEq、Eq、PartialOrd、Ord

这篇具有很好参考价值的文章主要介绍了rust学习-trait std::cmp::PartialEq、Eq、PartialOrd、Ord。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

PartialEq

介绍

pub trait PartialEq<Rhs = Self>
where
    Rhs: ?Sized,
{
   
    // Required method,后文有讲解这个注释
    fn eq(&self, other: &Rhs) -> bool;

    // Provided method,后文有讲解这个注释
    fn ne(&self, other: &Rhs) -> bool {
    ... }
}
x.eq(y) can also be written x == y
x.ne(y) can be written x != y
a!=b if and only if !(a==b)

对于不具有完全等价关系type,此trait允许部分相等(This trait allows for partial equality, for types that do not have a full equivalence relation)。
例如,在浮点数(floating point numbers)中 NaN != NaN,因此浮点类型实现 PartialEq 但不实现 Eq。
Formally speaking正式来说,当Rhs==Self时,这个特质对应于部分等价关系(hen Rhs == Self, this trait corresponds to a partial equivalence relation)。

如果Self和Rhs也实现了PartialOrd或Ord,那么它们的方法必须与PartialEq一致。
通过派生一些特征并手动实现其他特征,很容易意外地让他们产生不同意见。

等式关系equality relation,必须满足以下条件(对于 A、B、C 类型的所有 a、b、c):

对称Symmetric:
如果 A: PartialEq<B> 和 B: PartialEq<A>
则a==b 意味着b==a

传递Transitive:
如果 A: PartialEq<B> 和 B: PartialEq<C> 和 A: PartialEq<C>
则a==b 且 b==c 意味着 a==c

注意
B: PartialEq<A>(对称)和 A: PartialEq<C>(传递)实现并不强制存在
但只要它们确实存在,这些要求就适用

此trait可以与#[derive] 一起使用

  • 当在structs上派生时,如果所有字段都相等,则两个实例相等;如果任何字段不相等,则两个实例不相等。
  • 当基于枚举派生时,如果两个实例是相同的变体并且所有字段都相等,则它们相等。

示例

两个相同类型的比较

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
    }
}

fn main() {
   
    let b1 = Book {
    isbn: 3, format: BookFormat::Paperback };
    let b2 = Book {
    isbn: 3, format: BookFormat::Ebook };
    let b3 = Book {
    isbn: 10, format: BookFormat::Paperback };

    assert!(b1 == b2);
    assert!(b1 != b3);
}

两个不同类型的比较文章来源地址https://www.toymoban.com/news/detail-721448.html

// The derive implements <BookFormat> == <BookFormat> comparisons
#[derive(PartialEq)]
enum BookFormat {
   
    Paperback,
    Hardback,
    Ebook,
}

struct Book {
   
    isbn: i32,
    format: BookFormat,
}

// 实现 <Book> == <BookFormat> 比较,注意先后顺序
impl PartialEq<

到了这里,关于rust学习-trait std::cmp::PartialEq、Eq、PartialOrd、Ord的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Rust-trait

    Rust语言中的trait是非常重要的概念。 在Rust中,trait这一个概念承担了多种职责。在中文里,trait可以翻译为“特征”“特点”“特性”等。 trait中可以定义函数。用例子来说明,我们定义如下的trait: 上面这个trait包含了一个方法,这个方法只有一个参数,这个self参数是什么意

    2024年01月20日
    浏览(43)
  • 解决 undefined reference to cv::imread(std::__cxx11::basic_string<char, std::char_traits<char>,....

    在使用opencv时候可能会遇到 undefined reference to cv::imread(std::__cxx11::basic_stringchar, std::char_traitschar, std::allocatorchar const, int)\\\' 其主旨原因是使用的函数版本和引用的库函数版本不一至,要确保使用的函数和引用的库函数版本一致。 1、如何知道函数版本和引用的是否一样 1.1使用nm对

    2024年02月11日
    浏览(50)
  • 【Rust 基础篇】Rust Deref Trait 的使用

    在 Rust 中,Deref trait 是一种特殊的 trait,用于重载解引用操作符 * 。通过实现 Deref trait,我们可以定义类型的解引用行为,使其在使用 * 运算符时表现得像引用类型。 本篇博客将详细介绍 Rust 中如何实现和使用 Deref trait,以及它在代码中的应用场景。 Deref trait 的定义如下:

    2024年02月17日
    浏览(39)
  • Rust语法: 枚举,泛型,trait

    这是我学习Rust的笔记,本文适合于有一定高级语言基础的开发者看不适合刚入门编程的人,对于一些概念像枚举,泛型等,不会再做解释,只写在Rust中怎么用。 枚举的定义与赋值 枚举的定义格式如下: enum 枚举名{ 值1(附加类型), 值2(附加类型),… } 其中,关联类型可以省去

    2024年02月13日
    浏览(39)
  • 【Rust 基础篇】Rust Trait 实现:灵活的接口抽象

    Rust是一种以安全性和高效性著称的系统级编程语言,其设计哲学是在不损失性能的前提下,保障代码的内存安全和线程安全。为了实现这一目标,Rust引入了\\\"所有权系统\\\"、\\\"借用检查器\\\"等特性,有效地避免了常见的内存安全问题。然而,在编程中我们常常需要实现多态和抽象

    2024年02月15日
    浏览(38)
  • 30天拿下Rust之Trait

    概述         在Rust中,Trait是一个核心概念,它允许我们定义类型应该具有的行为。Trait类似于其他语言中的接口,但Rust的Trait更为强大和灵活。它不仅定义了一组方法,还允许我们指定方法的默认实现、泛型约束和继承。通过Trait,我们可以定义一组方法的签名和关联类

    2024年03月17日
    浏览(37)
  • 研读Rust圣经解析——Rust learn-16(高级trait,宏)

    我们使用type即可声明一个关联类型,关联类型的作用就是简化和隐藏显示类型(个人认为) 简化:一个很长的类型总是被需要时,需要开发者耗费精力的重复书写,而且若有改动,则需要改多个地方 隐藏:对外部调用者隐藏,外部调用者无需知道它指的是什么,只要

    2024年02月02日
    浏览(67)
  • 【Rust 基础篇】Rust派生宏:自动实现trait的魔法

    Rust是一门现代的、安全的系统级编程语言,它提供了丰富的元编程特性,其中派生宏(Derive Macros)是其中之一。派生宏允许开发者自定义类型上的trait实现,从而在编译期间自动实现trait。在本篇博客中,我们将深入探讨Rust中的派生宏,包括派生宏的定义、使用方法以及一些

    2024年02月14日
    浏览(32)
  • Rust之泛型、trait与生命周期

    泛型是具体类型或其他属性的抽象替代。在编写代码时,可以直接描述泛型的行为,或者它与其他泛型产生的联系,而无须知晓它在编译和运行代码时采用的具体类型。 们可以在声明函数签名或结构体等元素时使用泛型,并在随后搭配不同的具体类型来使用这些元素。 当使

    2024年02月13日
    浏览(39)
  • Rust系列(四) trait备忘录(持续更新)

    上一篇:Rust系列(三) 类型系统与trait 基于官方文档进行简单学习记录,保证所有示例是可运行的基本单元。测试 rust 程序除了使用官方的 playground 之外,还可以通过定义 [[example]] 来运行程序。 用于 不可变对象 的解引用操作,语法类似 *v 。 官方文档: https://doc.rust-lang.org

    2024年02月14日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包