陣列基礎
本集目標
用陣列(array)把多個相同型別的值排成一列,並學會怎麼存取和建立。
正文
之前學了 tuple 可以把不同型別的值打包在一起。今天來認識另一個好朋友——陣列(array)。陣列是「把一堆相同型別的值排成一列」。
建立陣列
fn main() {
let arr = [1, 2, 3, 4, 5];
println!("{:?}", arr);
}
這裡用了 {:?}(Debug 格式)來印陣列——還記得本章第 5 集嗎?陣列和 tuple 一樣,只有 Debug 格式,不能用 {}。
用中括號 [] 包起來,逗號隔開。注意:陣列裡的值必須是同一個型別。
fn main() {
let arr = [1, "hello", 3.14]; // ❌ 不行!型別不同
}
想混不同型別?用上幾集學的 tuple。
用索引取值
fn main() {
let arr = [1, 2, 3, 4, 5];
println!("第一個:{}", arr[0]);
println!("第三個:{}", arr[2]);
println!("最後一個:{}", arr[4]);
}
重點:索引從 0 開始!所以 5 個元素的索引是 0、1、2、3、4。
越界會 panic
如果你存取一個不存在的索引:
#![allow(unconditional_panic)]
fn main() {
let arr = [1, 2, 3, 4, 5];
println!("{}", arr[10]); // 💥 index out of bounds!
}
程式會直接崩潰(panic),印出錯誤。Rust 不會讓你偷偷讀到不該讀的記憶體。比起默默給你一個垃圾值,直接崩潰反而更安全——至少你馬上知道哪裡出錯了。
陣列的型別
陣列的型別寫法是 [元素型別; 長度]:
fn main() {
let arr: [i32; 5] = [1, 2, 3, 4, 5];
println!("{:?}", arr);
}
[i32; 5] 代表「一個放 5 個 i32 的陣列」。注意,長度也是型別的一部分——[i32; 3] 和 [i32; 5] 是不同的型別!
大部分時候 Rust 可以自動推斷,不用手動標。但知道怎麼寫型別在之後會很有用。
快速建立:重複語法
如果你想建立一個「5 個 0」的陣列:
fn main() {
let zeros = [0; 5];
println!("{:?}", zeros);
}
[0; 5] 的意思是「值 0,重複 5 次」。分號前面是值,後面是個數。
再來幾個例子:
fn main() {
let ones = [1; 10]; // 10 個 1
let flags = [true; 3]; // 3 個 true
println!("{:?}", ones);
println!("{:?}", flags);
}
重點整理
- 陣列用
[值1, 值2, ...]建立,所有元素必須同型別 - 索引從 0 開始,用
arr[0]取值 - 存取超出範圍的索引會 panic(程式崩潰)
- 陣列型別寫法是
[型別; 長度],如[i32; 5](長度也是型別的一部分) [值; 個數]可以快速建立重複的陣列,如[0; 5]- 用
{:?}印整個陣列