Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

切片作為參數

本集目標

用切片 &[i32] 當函數參數,這樣不管陣列多長都能傳進去。

正文

上一集學了切片,這集來看一個超實用的應用:把切片當作函數的參數

先看問題

假設你想寫一個函數來計算陣列的總和。如果用陣列當參數:

fn sum(nums: [i32; 5]) -> i32 {
    let mut total = 0;
    for x in nums {
        total += x;
    }
    total
}

fn main() {
    let a = [1, 2, 3, 4, 5];
    println!("{}", sum(a)); // ✅ 可以

    let b = [1, 2, 3];
    println!("{}", sum(b)); // ❌ 不行!b 有 3 個元素,但函數要 5 個
}

問題出在 [i32; 5]——你把長度寫死成 5 了。3 個元素的陣列就傳不進去。

解決方案:用切片

fn sum(nums: &[i32]) -> i32 {
    let mut total = 0;
    for x in nums {
        total += x;
    }
    total
}

fn main() {
    let a = [1, 2, 3, 4, 5];
    let b = [10, 20, 30];
    let c = [7];

    println!("a 的總和:{}", sum(&a)); // 15
    println!("b 的總和:{}", sum(&b)); // 60
    println!("c 的總和:{}", sum(&c)); // 7
}

把參數型別從 [i32; 5] 改成 &[i32],就能接受任何長度的陣列了!

呼叫的時候要加 &sum(&a) 表示「把 a 的切片傳進去」。

也可以傳切片的一部分

因為參數是 &[i32],你不只能傳整個陣列,也能傳一段切片:

fn sum(nums: &[i32]) -> i32 {
    let mut total = 0;
    for x in nums {
        total += x;
    }
    total
}

fn main() {
    let arr = [1, 2, 3, 4, 5];

    println!("全部:{}", sum(&arr));        // 15
    println!("前三個:{}", sum(&arr[..3])); // 6
    println!("後三個:{}", sum(&arr[2..])); // 12
}

這就是切片的威力——一個函數,各種用法。

為什麼切片比固定長度陣列好?

固定長度 [i32; 5]切片 &[i32]
只能接受剛好 5 個元素任何長度都行
換長度要重寫函數一個函數通吃

在實務中,幾乎所有接受陣列的函數都用切片當參數。

重點整理

  • 函數參數用 &[i32] 而不是 [i32; 5],就能接受任意長度
  • 呼叫時傳 &arr&arr[1..4] 都行
  • 切片參數讓函數更靈活、更通用
  • 這是 Rust 實務中最常見的寫法