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: PartialEq
则a==b 意味着b==a

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

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

此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);
}

两个不同类型的比较

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

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

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

你可能感兴趣的:(rust,rust,学习,开发语言)