1. 程式人生 > 其它 >【Rust】trait-派生

【Rust】trait-派生

環境

  • Rust 1.56.1
  • VSCode 1.61.2

概念

參考:https://doc.rust-lang.org/rust-by-example/trait/derive.html

示例

編譯器可以通過 #[derive] 屬性提供派生(自動實現)功能,以下 trait 支援派生:

  • 比較 trait: EqPartialEqOrdPartialOrd
  • Clone,用來從 &T 建立副本 T
  • Copy,使型別具有 “複製語義”而非 “移動語義”。
  • Hash,從 &T 計算雜湊值(hash)。
  • Default,建立資料型別的一個空例項。
  • Debug,使用 {:?} formatter 來格式化一個值。

main.rs

// 自動實現比較的 trait
#[derive(PartialEq, PartialOrd)]
struct Centimeters(f64);

// 自動實現 Debug trait
#[derive(Debug)]
struct Inches(i32);

impl Inches {
    fn to_centimeters(&self) -> Centimeters {
        let &Inches(inches) = self;

        Centimeters(inches as f64 * 2.54)
    }
}

struct Seconds(i32);

fn main() {
    let _one_second = Seconds(1);

    // 編譯錯誤,沒有實現 Debug trait
    // println!("One second looks like: {:?}", _one_second);

    // 編譯錯誤,沒有實現比較的 trait
    // let _this_is_true = (_one_second == _one_second);

    let foot = Inches(12);
    println!("One foot equals {:?}", foot);

    let meter = Centimeters(100.0);

    let cmp = if foot.to_centimeters() < meter {
        "smaller"
    } else {
        "bigger"
    };
    println!("One foot is {} than one meter.", cmp);
}

總結

瞭解了 Rust 中 trait 的派生,可以使用屬性來自動生成一個 trait 的實現。

附錄