切片作為參數
本集目標
用切片 &[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 實務中最常見的寫法