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

陣列基礎

本集目標

用陣列(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]
  • {:?} 印整個陣列