集合型別
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]
。