當我們為結構體 (Struct) 實作功能時,有時候一個方法內部的邏輯可能會變得複雜。一個很好的做法是將特定的計算或邏輯抽離出來,放到另一個輔助方法中。然後,我們的主方法就可以呼叫這個輔助方法來完成任務。
這小節將透過一個計算 Taylor Swift 歌曲發行了多久的範例,來展示這個強大的模式。
依舊使用之前的範例,並略作修改。
// 附註:這是一個屬性,讓我們的結構體可以用 `{:?}` 格式印出,方便調試。
#[derive(Debug)]
// 附註:定義了一個結構體,用來儲存歌曲的相關數據。
struct TaylorSwiftSong {
title: String,
year: u32,
duration_secs: u32,
}
// 為 TaylorSwiftSong 實作方法
impl TaylorSwiftSong {
// 主方法,用來顯示歌曲的完整資訊
fn display_song_info(&self) {
println!("Title: {}", self.title);
// 在這裡,我們呼叫了另一個方法 `years_since_release`
println!("Years since release: {}", self.years_since_release());
println!("Duration: {}sec.", self.duration_secs);
}
// 輔助方法,專門用來計算發行至今的年份
fn years_since_release(&self) -> u32 {
// 我們以 2025 年作為當前年份來計算
2025 - self.year
}
}
fn main() {
// 附註:創建一個 TaylorSwiftSong 結構體的實例,名為 blank_space。
let blank_space = TaylorSwiftSong {
title: String::from("Blank Space"),
year: 2014,
duration_secs: 231,
};
// 呼叫主方法來顯示所有資訊
blank_space.display_song_info();
}
在這個範例中,我們的目標是讓 display_song_info 方法不僅顯示歌曲的基本資料,還要計算並顯示它從發行至今過了多少年。與其將年份計算的邏輯直接寫在 display_song_info 中,我們創建了一個專門的輔助方法 years_since_release
。
years_since_release
fn years_since_release(&self) -> u32 {
2025 - self.year
}
display_song_info
fn display_song_info(&self) {
println!("Title: {}", self.title);
// 關鍵之處:呼叫同一個實例上的另一個方法
println!("Years since release: {}", self.years_since_release());
println!("Duration: {}sec.", self.duration_secs);
}
display_song_info
方法內部,我們已經有了 self
,它代表呼叫這個方法的 TaylorSwiftSong
實例(在我們的 main 函式中,就是 blank_space
)。self.
語法來呼叫定義在同一個 impl
區塊中的其他方法。self.years_since_release()
這一行程式碼的意思是:「嘿,self 這個實例,請執行你自己的 years_since_release
方法,並把結果告訴我。」讓我們跟隨程式的腳步,看看當 blank_space.display_song_info(); 被呼叫時,到底發生了什麼事:
main
函式呼叫 display_song_info
方法,此時 self
在 display_song_info
方法中就代表 blank_space
。display_song_info
開始執行,首先印出 Title: Blank Space
。display_song_info
需要印出發行年份。為了得到這個數值,它執行了 self.years_since_release()
。years_since_release
方法。此時,這個方法中的 self
同樣代表 blank_space
。years_since_release
方法執行計算:2025
- self.year
,也就是 2025 - 2014,得到結果 11。years_since_release
方法回傳 11。display_song_info
方法中,println!
巨集接收到回傳值 11,並印出 Years since release: 11
。display_song_info
印出歌曲時長,然後方法執行完畢。將複雜邏輯拆分成多個小方法,並在需要時互相呼叫,是撰寫清晰、可維護 Rust 程式碼的關鍵技巧之一。這樣做有幾個顯著的好處:
years_since_release
方法,而無需重複撰寫計算邏輯。display_song_info
的意圖變得非常清楚——它負責「顯示」,而將「計算」的細節委託給了其他方法。透過這種方式,你可以建構出既強大又易於理解的結構體和方法。