derive.md

在 Rust 中,#[derive(...)] 是一种用于自动生成实现的属性宏。它可以为结构体或枚举自动实现某些常见的 trait(特性)。这样做可以避免手动实现这些 trait 的冗长代码,提高代码的可维护性和简洁性。

在你的例子中,结构体 Access 上的 #[derive(...)] 宏实现了多个 trait。下面我会详细解释每个 trait 的意义和作用。

1. serde::Deserialize

  • 含义:这个 trait 允许结构体从外部数据格式(如 JSON、YAML、CSV 等)中进行反序列化(即解析)到 Rust 数据结构中。

  • 作用:当你使用 serde 进行序列化和反序列化时,Deserialize 是必须的 trait。它告诉编译器如何将数据转换为 Access 类型的结构体。

  • 示例:反序列化 JSON 数据:

    1
    2
    let json_data = r#"{ "key_index": [], "missing_strategy": null, "default": null }"#;
    let access: Access = serde_json::from_str(json_data).unwrap();

2. Debug

  • 含义Debug trait 使结构体可以使用 {:?} 格式化打印。

  • 作用:为结构体实现 Debug 后,你可以在调试时打印结构体的内容,方便查看结构体的值。这对调试程序非常有用。

  • 示例

    1
    2
    3
    4
    5
    6
    let access = Access {
    key_index: vec![],
    missing_strategy: None,
    default: None,
    };
    println!("{:?}", access); // 输出: Access { key_index: [], missing_strategy: None, default: None }

3. Clone

  • 含义Clone trait 允许你创建结构体的一个完全拷贝。

  • 作用Clone 使得你可以通过 .clone() 方法显式地复制结构体的值,而不是仅仅借用它。

  • 示例

    1
    2
    3
    4
    5
    6
    let access1 = Access {
    key_index: vec![KeyIndex::new()],
    missing_strategy: Some(MissingStrategy::new()),
    default: Some("default".to_string()),
    };
    let access2 = access1.clone(); // 复制 access1 到 access2

4. serde::Serialize

  • 含义Serialize trait 使结构体能够被序列化(转化为可存储或传输的格式,如 JSON、YAML 等)。

  • 作用:实现了 Serialize 的结构体可以被 serde 序列化为 JSON 或其他格式,通常用于网络通信或数据存储。

  • 示例

    1
    2
    3
    4
    5
    6
    7
    let access = Access {
    key_index: vec![],
    missing_strategy: None,
    default: Some("default".to_string()),
    };
    let json = serde_json::to_string(&access).unwrap();
    println!("{}", json); // 输出: {"key_index":[],"missing_strategy":null,"default":"default"}

5. Hash

  • 含义Hash trait 允许结构体被用作哈希容器(如 HashMapHashSet)的键。

  • 作用:如果你要把结构体作为哈希容器的键(例如 HashMapHashSet),需要为它实现 Hash trait。Hash trait 允许结构体生成一个哈希值。

  • 示例

    1
    2
    3
    4
    5
    6
    7
    8
    use std::collections::HashSet;
    let mut set = HashSet::new();
    let access = Access {
    key_index: vec![],
    missing_strategy: None,
    default: None,
    };
    set.insert(access); // 在 HashSet 中存储结构体

6. Eq

  • 含义Eq trait 表示结构体类型的值可以被视为相等(==)或不相等(!=)。

  • 作用EqPartialEq 的一个扩展,表示该类型的所有实例都能通过 ==!= 运算符进行比较。

  • 示例

    1
    2
    3
    4
    5
    6
    7
    let access1 = Access {
    key_index: vec![],
    missing_strategy: None,
    default: Some("default".to_string()),
    };
    let access2 = access1.clone();
    assert_eq!(access1, access2); // 如果 `Eq` 被实现,这个比较将返回 true

7. PartialEq

  • 含义PartialEq trait 允许结构体的值进行部分等价比较。

  • 作用:通过实现 PartialEq,你可以使用 ==!= 来比较结构体的值。通常用于检查结构体是否相等。

  • 示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    let access1 = Access {
    key_index: vec![],
    missing_strategy: None,
    default: Some("default".to_string()),
    };
    let access2 = Access {
    key_index: vec![],
    missing_strategy: None,
    default: Some("default".to_string()),
    };
    assert_eq!(access1, access2); // 如果 `PartialEq` 被实现,这个比较将返回 true

总结

  • #[derive(...)] 属性宏是 Rust 中的一个便捷工具,它自动为结构体或枚举实现一些常见的 trait。
  • 你可以通过在结构体上使用 #[derive(...)] 来自动实现多种常见功能,如序列化、克隆、比较、打印调试信息等。
  • 使用 derive 宏时,Rust 会为结构体或枚举提供默认的 trait 实现,通常会满足大多数常见需求,避免手动实现这些 trait,简化代码。

这些 trait 和它们的自动实现可以帮助你快速构建功能齐全且类型安全的数据结构。


derive.md
https://abrance.github.io/2024/11/28/mdstorage/domain/rust/derive/
Author
xiaoy
Posted on
November 28, 2024
Licensed under