iT邦幫忙

0

二、三天學一點點 Rust:來! Structs 、在方法中呼叫另一個方法(32)

  • 分享至 

  • xImage
  •  

🎶 在方法中呼叫另一個方法

當我們為結構體 (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

  1. 輔助方法:years_since_release
fn years_since_release(&self) -> u32 {
    2025 - self.year
}
  • 單一職責原則:這個方法只做一件事——計算發行至今的年份。這使得程式碼非常清晰。如果未來計算規則需要改變(例如,我們想從網路動態獲取當前年份),我們只需要修改這一個地方。
  • &self 參數:這個方法只需要讀取 self.year 的值,不需要修改任何數據,所以它接收一個不可變引用 &self。
  • 回傳值 -> u32:它計算完年份後,回傳一個 u32 型別的整數。
  1. 主方法: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(); 被呼叫時,到底發生了什麼事:

  1. main 函式呼叫 display_song_info 方法,此時 selfdisplay_song_info 方法中就代表 blank_space
  2. display_song_info 開始執行,首先印出 Title: Blank Space
  3. 接下來,display_song_info 需要印出發行年份。為了得到這個數值,它執行了 self.years_since_release()
  4. 程式的控制權暫時轉移到 years_since_release 方法。此時,這個方法中的 self 同樣代表 blank_space
  5. years_since_release 方法執行計算:2025 - self.year,也就是 2025 - 2014,得到結果 11。
  6. years_since_release 方法回傳 11。
  7. 控制權回到 display_song_info 方法中,println! 巨集接收到回傳值 11,並印出 Years since release: 11
  8. 最後,display_song_info 印出歌曲時長,然後方法執行完畢。

🎓 結論

將複雜邏輯拆分成多個小方法,並在需要時互相呼叫,是撰寫清晰、可維護 Rust 程式碼的關鍵技巧之一。這樣做有幾個顯著的好處:

  • 模組化 (Modularity):每個方法都有一個明確、單一的職責。
  • 可重用性 (Reusability):如果程式的其他地方也需要計算發行年份,可以直接呼叫 years_since_release 方法,而無需重複撰寫計算邏輯。
  • 可讀性 (Readability):display_song_info 的意圖變得非常清楚——它負責「顯示」,而將「計算」的細節委託給了其他方法。

透過這種方式,你可以建構出既強大又易於理解的結構體和方法。


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言