在 Rust 中,函式(function) 是用來封裝一組可重複執行的指令步驟。
你可以將重複的邏輯寫成函式,在需要的時候「呼叫」它,讓程式碼更乾淨、可讀性更高!
fn main() {
open_store("NewYork");
bake_pizze(12, "pepperoni");
swim_in_profit();
open_store("Brooklyn");
}
fn open_store(neighborhood: &str) {
println!("Opening my pizza store in {}.", neighborhood);
}
fn bake_pizze(number: i32, topping: &str) {
println!("Baking {} {} pizza.", number, topping);
}
fn swim_in_profit() {
println!("So much $$$, so little time.");
}
函式名稱 | 功能描述 |
---|---|
open_store() |
接收一個地區名稱,印出開店訊息。 |
bake_pizze() |
接收數量與配料,印出正在烘焙的披薩種類。 |
swim_in_profit() |
沒有參數,印出財富的誇張語句。 |
main() |
Rust 的進入點函式,依序呼叫其他函式。 |
名詞 | 說明 | 範例 |
---|---|---|
函式定義 | 宣告一個函式的名稱、參數、與執行內容 | fn open_store(neighborhood: &str) { ... } |
參數(parameter) | 函式定義中預期的輸入變數 | neighborhood: &str |
引數(argument) | 實際呼叫函式時傳入的值 | "NewYork" |
函式呼叫 | 在程式中使用函式,並傳入對應參數的引數 | open_store("NewYork"); |
在 Rust 中,函式(function)不只可以執行一連串操作,還可以「回傳一個值」給呼叫者。
這個值被稱為:回傳值(return value)。
fn main() {
let result = square(5);
println!("The square of 5 is {}.", result);
let result = square(12);
println!("The square of 12 is {}.", result);
}
fn square(number: i32) -> i32 {
return number * number;
}
部分 | 說明 |
---|---|
fn square(number: i32) |
定義一個函式名稱為 square ,參數為一個 i32 整數。 |
-> i32 |
表示這個函式會回傳一個 i32 型別的值。 |
return number * number; |
使用 return 回傳運算結果。 |
let result = square(5); |
呼叫函式並接收回傳值到變數 result 。 |
另外如果把square函式寫成:
fn square(number: i32) -> i32 {
number * number
}
在 Rust 中,函式的最後一行如果是「沒有分號的表達式」,它會被自動作為回傳值。這就叫做:
✅ Implicit Return(隱式回傳)
不用寫 return,Rust 會自動把最後一行「沒加分號的表達式」當作回傳值。
✅ Explicit Return(顯式回傳)
就是使用 return 關鍵字明確指定回傳值,後面要加分號 ;
()
是什麼?有什麼用?在 Rust 中,有一種非常特別的型別叫做 Unit 型別,寫作 ()
,而()
是一個合法的型別(不像 JavaScript 的 undefined),它表示:無回傳值、無內容,但仍代表「這個運算已完成」。
當然它不是空的陣列,也不是空的字串,而是:
✅ 一個 沒有值的元組(tuple without values),也被稱為「單元值」。
fn main() {
let _result = mystery(); // _result 的型別是 ()
}
fn mystery() {
// 沒有回傳值,也沒用 return,Rust 自動回傳 ()
}
即使 mystery() 函式裡什麼都沒做,它還是會自動回傳 (),這就是 Rust 的 Unit 型別。
特性 | 說明 |
---|---|
型別名稱 | () (讀作 unit 或 unit type) |
語意 | 表示「什麼都不需要回傳,但有完成一件事」 |
自動產生 | 如果函式沒明確回傳值,Rust 會自動補上 () |
對應語言概念 | 類似 Python 的 None 、JavaScript 的 undefined 或 void |
可當作佔位值 | 可作為 Result<(), Error> 中的成功型別表示「成功但無額外資料」 |
1.函式沒有回傳值時:
fn log_info(message: &str) {
println!("{}", message);
// 自動回傳 ()
}
2.用作成功但沒有值的訊號:
fn try_something() -> Result<(), String> {
if true {
Ok(())
} else {
Err("Something went wrong.".to_string())
}
}
3.作為測試副作用的函式:
fn do_nothing() {}
在 Rust 中,區塊(block) 是使用大括號 {}
括起來的一段程式碼。
它不僅用來包裹語句(statement),更是一個「表達式(expression)」,可以回傳值!
fn main() {
let multiplier = 3;
let calculation = {
let value = 5 + 4;
value * multiplier
};
println!("{}", calculation); // ➜ 27
}
區塊部分 | 說明 |
---|---|
let multiplier = 3; |
宣告一個變數,在區塊外部定義,可在區塊內部使用 |
{ ... } |
一個 block,裡面可以執行多行程式碼(語句) |
let value = 5 + 4; |
區塊內部的變數,只在 block 內有效(區域作用域) |
value * multiplier |
block 的最後一行是表達式,它的值會成為整個 block 的回傳值 |
let calculation = { ... }; |
這行就是將 block 的「結果值」賦給變數 calculation |
✅ 最後印出 calculation,結果是:9 × 3 = 27
特性 | 說明 |
---|---|
是一個「表達式」 | Rust 的 block { ... } 最後一行沒加分號,會當作回傳值 |
可以賦值給變數 | let x = { ... } 的寫法成立,因為 block 是一種有值的表達式 |
有自己的作用域(scope) | 在 block 中用 let 宣告的變數,只在區塊中有效,不會污染外部變數命名空間 |
結構靈活、便於拆解邏輯 | 可用來包裝一段局部運算、前置邏輯、條件運算等 |
寫法 | 結果 |
---|---|
最後一行是表達式、無分號 | 該值被回傳 |
最後一行加了分號 value * 3; |
回傳 () (Unit) |
使用 return 明確回傳 |
提前結束、回傳指定值 |