跳轉至

建立 2026-09-19 更新 2026-09-19

函式

函式把一段可重複使用的邏輯包起來。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 ...

函式的最後一行如果是不加分號的運算式,就是回傳值。多加一個分號就會變成陳述式,回傳型別變成 (),編譯器會報錯:

fn plus_one(x: i32) -> i32 {
    x + 1 // 沒有分號:回傳 x + 1
}

fn main() {
    println!("{}", plus_one(5));
}

要提早結束函式,可以用 return

fn abs(x: i32) -> i32 {
    if x < 0 {
        return -x;
    }
    x
}

fn main() {
    println!("{}", abs(-8));
}

回傳多個值

用 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 最重要的主題:所有權