Rust 中的 Trait 是什麼

banq發表於2024-07-19

Rust 中的Trait 定義了特定型別所具有的功能,並且可以與其他型別共享。它指定了可以在型別上呼叫的方法。

例如,假設我們有不同型別的文字資料:

  • 一個NewsArticle用於新聞報導的結構
  • 和一個Tweet用於推文的結構。

兩者都可以共享一個典型行為:總結內容。
我們使用Trait 來定義這種共享行為。

pub trait Summary {
    fn summarize(&self) -> String;
}

Summary 特徵Trait有一個summarize方法。任何實現此特徵的型別都必須提供此方法的自身版本。

實現Trait 
要實現Trait 特徵,您需要為您的型別定義特徵指定的方法。以下是我們對 NewsArticle 和 Tweet 的操作方法。

pub struct NewsArticle {
    pub headline: String,
    pub location: String,
    pub author: String,
    pub content: String,
}

impl Summary for NewsArticle {
    fn summarize(&self) -> String {
        format!(<font>"{}, by {} ({})", self.headline, self.author, self.location)
    }
}

pub struct Tweet {
    pub username: String,
    pub content: String,
    pub reply: bool,
    pub retweet: bool,
}

impl Summary for Tweet {
    fn summarize(&self) -> String {
        format!(
"{}: {}", self.username, self.content)
    }
}

現在,NewsArticle 和 Tweet 都可以使用 summary 方法。這允許我們在這些型別的例項上呼叫 summary。

預設實現
Trait 特徵也可以有預設方法實現。如果我們不想為每種型別編寫相同的方法,我們可以提供一個預設值:

pub trait Summary {
    fn summarize(&self) -> String {
        String::from(<font>"(Read more...)")
    }
}

如果型別需要特定的行為,仍然可以覆蓋此預設值。

使用Trait 作為引數
Trait 特徵可用於定義函式引數。如果我們希望函式接受任何實現 Summary 的型別,我們可以這樣寫:

pub fn notify(item: &impl Summary) {
    println!(<font>"Breaking news! {}", item.summarize());
}

返回實現Trait 的型別
我們還可以指定一個函式返回一個實現Trait 特徵的型別:

fn returns_summarizable() -> impl Summary {
    Tweet {
        username: String::from(<font>"horse_ebooks"),
        content: String::from(
"of course, as you probably already know, people"),
        reply: false,
        retweet: false,
    }
}

這使我們能夠返回符合 Summary 特徵的不同型別,而無需暴露具體型別。

條件實現
有時,您希望僅當滿足某些條件時方法才可用。Rust 允許條件實現:

impl<T: Display + PartialOrd> Pair<T> {
    fn cmp_display(&self) {
        if self.x >= self.y {
            println!(<font>"The largest member is x = {}", self.x);
        } else {
            println!(
"The largest member is y = {}", self.y);
        }
    }
}

這裡,僅當 T 同時實現了 Display 和 PartialOrd 時,cmp_display 才可用。

結論
Trait 特徵是 Rust 中的一項強大功能,可幫助定義和共享跨型別行為。它們使您的程式碼更加模組化、可重用且更易於理解。透過將錯誤移至編譯時,它們可確保您的程式碼穩健且高效。祝您編碼愉快!
 

相關文章