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

【Rust】特質-trait

環境

  • Rust 1.56.1
  • VSCode 1.61.2

概念

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

示例

trait 一般翻譯成特質,之後的內容不翻譯,類似其它語言中的介面。

main.rs

struct Sheep {
    naked: bool,
    name: &'static str,
}

trait Animal {
    // Self 表示實現的型別,注意關聯函式和方法的區別
    fn new(name: &'static str) -> Self;
    fn name(&self) -> &str;
    fn noise(&self) -> &str;
    // 可以進行預設實現
    fn talk(&self) {
        println!("{} says {}", self.name(), self.noise());
    }
}

impl Sheep {
    fn is_naked(&self) -> bool {
        self.naked
    }

    fn shear(&mut self) {
        if self.is_naked() {
            println!("{} is already naked...", self.name());
        } else {
            println!("{} gets a haircut!", self.name);
            self.naked = true;
        }
    }
}

impl Animal for Sheep {
    fn new(name: &'static str) -> Sheep {
        Sheep {
            name: name,
            naked: false,
        }
    }

    fn name(&self) -> &str {
        self.name
    }

    fn noise(&self) -> &str {
        if self.is_naked() {
            "baaaaah?"
        } else {
            "baaaaah!"
        }
    }

    fn talk(&self) {
        // 可以覆蓋預設的方法
        println!("{} pauses briefly... {}", self.name, self.noise());
    }
}

fn main() {
    // 型別註解必須要
    let mut dolly: Sheep = Animal::new("Dolly");

    dolly.talk();
    dolly.shear();
    dolly.talk();
}

總結

瞭解了 Rust 中 trait 的定義方式和實現方式。

附錄