当你有很多trait(接口)实现类型时,它很快就会变得乏味,并且可能会给你的代码增加很多复杂性。
struct Point { x: u64, y: u64, }
impl Debug for Point { // ... }
impl Display for Point { // ... }
impl Something for Point { // ... }
impl SomethingElse for Point { // ... }
// ...
|
幸运的是,Rust 为我们提供了一些东西:derive 属性。
通过使用该derive属性,我们实际上将我们的类型提供给一个Derive 宏,它是一种过程宏。
他们将代码作为输入(在本例中为我们的类型),并在编译时创建更多代码作为输出。
这对于数据反序列化特别有用:只需实现 crate 中的 Serialize和Deserialize特征,我们就可以将我们的类型序列化和反序列化为许多数据格式:JSON、YAML、TOML , BSON等等...
use serde::{Serialize, Deserialize};
#[derive(Debug, Clone, Serialize, Deserialize)] struct Point { x: u64, y: u64, }
|
不费吹灰之力,我们就为我们的结构Point实现了Debug、Clone、Serialize和Deserialize的trait。需要注意的是,您的结构的所有子字段都需要实现这些trait。
use serde::{Serialize, Deserialize};
// 你不能这么做 #[derive(Debug, Clone, Serialize, Deserialize)] struct Point<T> { x: T, y: T, }
// 你需要这么做: use serde::{Serialize, Deserialize}; use core::fmt::Debug; // Import the Debug trait
#[derive(Debug, Clone, Serialize, Deserialize)] struct Point<T: Debug + Clone + Serialize + Deserialize> { x: T, y: T, }
|