集合型別

Rust 有許多型別用來做出集合(collection)。集合是在某個地方你需要有超過一個值時用的。例如,你可以在一個變數中包含你所在國家的所有城市資訊。我們會先從陣列(array)開始,它的速度最快,但功能也最少。在這方面它們有點像 &str

陣列

陣列是放在中括號裡的資料:[]。陣列特性:

  • 不能改變其大小,
  • 必須只包含相同型別資料。

然而它們的速度卻非常快。

陣列的型別是:[type; number]。例如,["One", "Two"] 的型別是 [&str; 2]。這意味著,即使這兩個是陣列也有不同的型別:

fn main() {
    let array1 = ["One", "Two"]; // 這個型別是 [&str; 2]
    let array2 = ["One", "Two", "Five"]; // 但這個型別是 [&str; 3]。不同型別!
}

這裡有個好提示:要想知道變數的型別,你可以藉由給編譯器不正確的程式碼來"詢問"它。比如說:

fn main() {
    let seasons = ["Spring", "Summer", "Autumn", "Winter"];
    let seasons2 = ["Spring", "Summer", "Fall", "Autumn", "Winter"];
    seasons.ddd(); // ⚠️
    seasons2.thd(); // 還是⚠️
}

編譯器說:"什麼?seasons 沒有 .ddd() 的方法,seasons2 也沒有 .thd() 的方法!!" 你可以看到:

error[E0599]: no method named `ddd` found for array `[&str; 4]` in the current scope
 --> src\main.rs:4:13
  |
4 |     seasons.ddd(); // 
  |             ^^^ method not found in `[&str; 4]`

error[E0599]: no method named `thd` found for array `[&str; 5]` in the current scope
 --> src\main.rs:5:14
  |
5 |     seasons2.thd(); // 
  |              ^^^ method not found in `[&str; 5]`

所以它告訴你 method not found in `[&str; 4]`,這就是變數的型別。

如果你想要一個數值都一樣的陣列,你可以像這樣宣告:

fn main() {
    let my_array = ["a"; 10];
    println!("{:?}", my_array);
}

這裡印出 ["a", "a", "a", "a", "a", "a", "a", "a", "a", "a"]

這個方法經常用來建立緩衝區(buffer)。例如,let mut buffer = [0; 640] 建立一個 640 個零的陣列。然後我們可以將零改為其他數字,以便新增資料。

你可以用 [] 來索引(獲取)陣列中的項目。第一個索引項目是 [0],第二個是 [1],以此類推。

fn main() {
    let my_numbers = [0, 10, -20];
    println!("{}", my_numbers[1]); // 印出 10
}

你可以得到陣列的一個切片(slice,一塊)。首先你需要 &,因為編譯器不知道大小。然後你可以使用 .. 來表示範圍。

例如,讓我們使用這個陣列:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

fn main() {
    let array_of_ten = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

    let three_to_five = &array_of_ten[2..5];
    let start_at_two = &array_of_ten[1..];
    let end_at_five = &array_of_ten[..5];
    let everything = &array_of_ten[..];

    println!("Three to five: {:?}, start at two: {:?}, end at five: {:?}, everything: {:?}", three_to_five, start_at_two, end_at_five, everything);
}

記住這些:

  • 索引號從 0 開始(不是 1)
  • 索引範圍是排除的(不包括最後一個數字)。

所以 [0..2] 是指第一項索引和第二項索引(0 和 1)。或者你也可以稱它為"第零和第一項"索引。它沒有第三項,也就是索引 2。

你也可以有一個 包含的 範圍,這意味著它也包括最後一個數字。要做到這一點。加上 =,寫成 ..=,而不是 ..。所以,如果你想要第一、第二和第三項,可以寫成 [0..=2],而不是 [0..2]