iT邦幫忙

0

二、三天學一點點 Rust:來!if、else if、else、match(14)

  • 分享至 

  • xImage
  •  

🦀 Rust if 條件式:邏輯判斷與三元運算概念

在 Rust 中,我們常用 if、else if 和 else 來進行條件判斷。這些語法讓我們可以根據變數的值做出不同的行為,是控制程式流程的基礎。

✅ 範例程式:學齡與奇偶數判斷

fn main() {
    let result = years_old(17);
    println!("{}", result); // 輸出:High school!

    even_or_odd(17);        // 輸出:The number is odd.
}

fn years_old(age: i32) -> &'static str {
    if age <= 12 {
        "Elementary school!"
    } else if age <= 15 {
        "Junior high school!"
    } else if age <= 18 {
        "High school!"
    } else if age <= 24 {
        "University!"
    } else {
        "Adult!"
    }
}

fn even_or_odd(number: i32) {
    let result = if number % 2 == 0 { "even" } else { "odd" };
    println!("The number is {}.", result);
}

🧠 if、else if、else 差異與使用時機

關鍵字 說明 使用時機
if 判斷第一個條件是否成立 用於程式第一個邏輯分支
else if 當上方條件不成立時,檢查其他可能 用於額外條件,可接多個
else 前述所有條件都不成立時執行 作為預設情況,通常放在最末一個條件之後

✨ if 條件可作為表達式使用(類似三元運算)

Rust 中的 if 不只是語句(statement),它其實是表達式(expression),也就是可以產生值的運算元。這讓我們能像其他語言的三元運算子一樣,寫出簡潔的條件式:

例如上述程式範例:奇偶數判斷

let result = if number % 2 == 0 { "even" } else { "odd" };

這段就像 C 或 JavaScript 中的:

result = (number % 2 == 0) ? "even" : "odd";

✅ 特點:

if 是表達式,可以直接賦值給變數。
每個分支的型別(type)必須相同,否則會編譯錯誤。
else 是必要的,因為表達式一定要有值產出。

🎯 小技巧與常見錯誤

⚠️ 錯誤:少了 else 導致無法回傳值

let result = if number > 0 { "positive" }; // 編譯錯誤

需改為:

let result = if number > 0 { "positive" } else { "non-positive" };

⚠️ 型別不一致會錯誤

let result = if flag { "yes" } else { 0 }; // 編譯錯誤:型別不一致

✅ 小結

特性 說明
Rust if 是表達式 可以用來直接賦值,與其他語言的三元運算類似
型別要一致 所有分支產生的值型別必須相同
可讀性高 if / else if / else 結構清楚、易維護
適合多條件判斷 多層級分類(如年齡分段)使用 else if 最直觀

🧩 match 語法

Rust 中的 match 是一種功能強大且靈活的條件分支語法,它類似於其他語言的 switch,但更安全且更具表達力。

✅ match 的基本格式

match 值 {
    模式1 => 動作1,
    模式2 => 動作2,
    _ => 預設動作,
}
  • 每個分支使用 => 指向要執行的動作。
  • 用逗號 , 分隔每個分支。
  • match 必須涵蓋所有可能的情況,否則編譯會報錯。
  • _ 是萬用模式(default case),用於捕捉所有其他未匹配的情況。

🧪 練習一:季節對應訊息

fn season_thing(season: &str) -> String {
    match season {
        "summer" => format!("School's out!"),
        "winter" => format!("brr, so cold!"),
        _ => format!("Lots of rain!"),
    }
}
元素 說明
season: &str 傳入的參數,為文字字串切片
"summer""winter" 精確比對文字
_ 捕捉所有其他情況(例如 spring, fall)
format!() 建立字串並回傳(不直接印出)

🧪 練習二:判斷奇偶數(帶條件的 match)

fn even_and_odd(number: i32) -> String {
    match number {
        x if x % 2 == 0 => format!("{} is an even number.", x),
        y if y % 2 != 0 => format!("{} is an odd number.", y),
        _ => unreachable!(),
    }
}
元素 說明
x if x % 2 == 0 模式守衛(match guard):只有滿足條件時才會進入該分支
y if y % 2 != 0 同上,條件相反
unreachable!() 表示這段程式碼理論上永遠不會被執行,防止遺漏分支或意外

🧠 提醒:

  • 模式守衛 if 是 match 的進階功能,適合對值做更細的判斷。
  • 不建議濫用 match 做所有條件式,簡單情況下 if 會更直觀。
  • unreachable!() 是一個編譯期提示 + 執行期 panic,不應濫用,但在確認不會發生的情況下可以加強安全性。

📌 match v.s if-else 比較

特性 match if / else if
適用情境 多種明確的值判斷(如 enum、字串、數值) 複雜邏輯或範圍比對
是否必須涵蓋所有情況 ✅ 是,否則編譯錯誤(除非用 _ ❌ 否,最後加 else 才完整
可讀性 高(列舉條件清楚) 高(條件清楚,但可能較冗長)
支援條件守衛 ✅ 是(x if 語法) ✅ 是(內建邏輯即可)

✅ 小結

match 是功能強大又安全的分支工具,搭配條件守衛更靈活。
可用於模式比對、文字字串、數字、enum 等。
若回傳資料,建議搭配 format!(),而非直接 println!()。
若不需回傳,可僅做副作用(如輸出)。


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

尚未有邦友留言

立即登入留言