學習Rust:派生derive屬性

banq發表於2022-10-04

當你有很多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 中的 SerializeDeserialize特徵,我們就可以將我們的型別序列化和反序列化為許多資料格式:JSONYAMLTOML , 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,
}


 

相關文章