Rust语言Derive说明

  1. 1. 概述
  2. 2. 特性
  3. 2.1 Eq VS PartialEq

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

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 wind.kaisa@gmail.com

文章标题:Rust语言Derive说明

本文作者:kaisawind

发布时间:2020-04-28, 03:38:04

最后更新:2020-07-21, 14:35:46

原始链接:https://kaisawind.gitee.io/2020/04/27/2020-04-28-rust-Derive/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏