kaisawind's blog
  • 关于
  • 所有帖子

Rust语言Derive说明 - Tue, Apr 28, 2020

Rust语言Derive说明

1. 概述

编译器可以通过#[derive(*****)]为某些特性提供基本的实现。

2. 特性

特性作用说明
Eq等价关系比较是否相等
PartialEq局部等价比较部分是否相等
Ord比较大小比较大小
PartialOrd部分比较大小部分比较大小
Clone深拷贝深拷贝
Copy浅拷贝浅拷贝
Hash计算Hash值计算Hash值
Default默认值默认值
Debug{:?}进行格式化{:?}进行格式化

2.1 Eq VS PartialEq

等价关系需要满足的条件:

  • 对称性(Symmetry):a == b 可推出 b == a
  • 传递性(Transitivity):a == b 且 b == c 可推出 a == c
  • 反身性(Reflexivity):a == a

Rust只实现了PartialEq,由于IEEE规定浮点数和NaN不等于自身,所以反身性不成立。这也导致Eq需要手动进行判断。

对于大多数类型来说,Eq和PartialEq需要同时存在。 原始字段

enum BookFormat { Paperback, Hardback, Ebook }
struct Book {
    isbn: i32,
    format: BookFormat,
}

使用derive

#[derive(PartialEq,Eq)]
enum BookFormat { Paperback, Hardback, Ebook }
#[derive(PartialEq,Eq)]
struct Book {
    isbn: i32,
    format: BookFormat,
}

具体实现


enum BookFormat { Paperback, Hardback, Ebook }

impl PartialEq<BookFormat> for BookFormat {
    fn eq(&self, other: &BookFormat) -> bool {
        self == *other
    }
}
impl Eq for BookFormat {}

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

impl PartialEq<Book> for Book {
    fn eq(&self, other: &Book) -> bool {
        self.isbn == *other.isbn && self.format == *other.format
    }
}
impl Eq for Book {}


辽ICP备2021007608号 | © 2025 | kaisawind

Facebook Twitter GitHub