函式
函式把一段可重複使用的邏輯包起來。Rust 的函式有兩個特色:參數與回傳值都必須標註型別,而且最後一個運算式會自動成為回傳值。本頁同時介紹輸出用的 println! 格式化。
定義與呼叫
fn add(a: i32, b: i32) -> i32 {
a + b
}
fn greet(name: &str) {
println!("哈囉,{name}!");
}
fn main() {
let sum = add(3, 4);
println!("{sum}");
greet("Rust");
}
- 函式名稱使用
snake_case。 - 參數型別一定要寫,這讓編譯器不需要猜測。
- 沒有回傳值時省略
->,實際上回傳的是空的 tuple()(稱為 unit 型別)。
運算式與陳述式
Rust 區分兩個概念:
| 名稱 | 特徵 | 例子 |
|---|---|---|
| 陳述式(statement) | 執行動作,不回傳值,結尾有分號 | let x = 5; |
| 運算式(expression) | 會算出一個值,結尾沒有分號 | a + b、{ ... }、if ... else ... |
函式的最後一行如果是不加分號的運算式,就是回傳值。多加一個分號就會變成陳述式,回傳型別變成 (),編譯器會報錯:
要提早結束函式,可以用 return:
回傳多個值
用 tuple 一次回傳多個值:
fn min_max(nums: &[i32]) -> (i32, i32) {
let mut min = nums[0];
let mut max = nums[0];
for &n in nums {
if n < min {
min = n;
}
if n > max {
max = n;
}
}
(min, max)
}
fn main() {
let (lo, hi) = min_max(&[3, 9, 1, 7]);
println!("最小 {lo},最大 {hi}");
}
參數的型別 &[i32] 是「借用」一段整數序列,意思是函式只是讀取,不取走所有權,詳見 借用與參照。
println! 與格式化
println! 是最常用的輸出巨集,{} 是佔位符:
fn main() {
let name = "小明";
let age = 30;
println!("{},{} 歲", name, age); // 位置參數
println!("{name},{age} 歲"); // 直接嵌入變數名稱
println!("{:>5}|{:<5}|{:^5}|", 1, 2, 3); // 靠右、靠左、置中
println!("{:.2}", 3.14159); // 小數點後兩位
println!("{:?}", vec![1, 2, 3]); // Debug 格式,除錯用
}
{} 用於給人閱讀的 Display 格式;{:?} 用於除錯的 Debug 格式。自訂型別要能用 {:?} 輸出,需要加上 #[derive(Debug)],見 結構體與方法。
匿名函式
Rust 也有匿名函式,稱為閉包(closure),寫法是 |參數| 運算式。它可以使用外部變數,詳見 閉包與迭代器。
推薦影音
函式
簡述:微軟《Beginner's Series to Rust》第 13 集,說明函式的宣告、參數與回傳值。
基礎語法到此告一段落,接下來進入 Rust 最重要的主題:所有權。