在 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 |
前述所有條件都不成立時執行 | 作為預設情況,通常放在最末一個條件之後 |
Rust 中的 if 不只是語句(statement),它其實是表達式(expression),也就是可以產生值的運算元。這讓我們能像其他語言的三元運算子一樣,寫出簡潔的條件式:
例如上述程式範例:奇偶數判斷
let result = if number % 2 == 0 { "even" } else { "odd" };
這段就像 C 或 JavaScript 中的:
result = (number % 2 == 0) ? "even" : "odd";
if 是表達式,可以直接賦值給變數。
每個分支的型別(type)必須相同,否則會編譯錯誤。
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 最直觀 |
Rust 中的 match 是一種功能強大且靈活的條件分支語法,它類似於其他語言的 switch,但更安全且更具表達力。
match 值 {
模式1 => 動作1,
模式2 => 動作2,
_ => 預設動作,
}
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!() |
建立字串並回傳(不直接印出) |
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!() |
表示這段程式碼理論上永遠不會被執行,防止遺漏分支或意外 |
特性 | match |
if / else if |
---|---|---|
適用情境 | 多種明確的值判斷(如 enum、字串、數值) | 複雜邏輯或範圍比對 |
是否必須涵蓋所有情況 | ✅ 是,否則編譯錯誤(除非用 _ ) |
❌ 否,最後加 else 才完整 |
可讀性 | 高(列舉條件清楚) | 高(條件清楚,但可能較冗長) |
支援條件守衛 | ✅ 是(x if 語法) |
✅ 是(內建邏輯即可) |
match 是功能強大又安全的分支工具,搭配條件守衛更靈活。
可用於模式比對、文字字串、數字、enum 等。
若回傳資料,建議搭配 format!(),而非直接 println!()。
若不需回傳,可僅做副作用(如輸出)。