Rust 的複合型別
在 Rust 中,有些型別是由其他型別組合而成的,這些型別稱為複合型別,這些複合型別可以讓我們更好的處理資料,讓程式更簡潔。
元組(tuple)
元組有固定長度的特性,代表著一但宣告完,之後就無法再增加或刪減。
建立元組的方法是用一個 ()
將值放入,每個值之間用 ,
分隔,不同值不限定相同型別:
1 | let nums = (1, 4.4, 333); |
雖然不一定要加上型別,但以下為加上型別的範例:
1 | let nums: (u8, f64, i32) = (1, 4.4, 333); |
兩種方法可以取出 tuple 的值:
1.
1 | fn main() { |
2.
1 | fn main() { |
陣列(array)
陣列和元組不同的是,每個型別都必須是一樣的,而宣告的方式跟大部分的陣列宣告差不多,都是使用 []
將值放入,並用 ,
區分開來。就像這樣:
1 | let new_arr = [1, 2, 3]; |
如果要加上型別的話,也是用 []
,但要注意的是,只需要加入型別跟值的數量,並且用 ;
區隔,就像這樣:
1 | let new_arr = [u8; 3] = [1, 2, 3]; |
而 Rust 的陣列跟其他程式語言比較不同的地方在於,Rust 的陣列有數量的限制,最多為 32,如果超過的部分,資料就會被丟棄。
所以 Rust 的陣列適合用在已確定值的多寡,像是一年有十二個月、一週有七天這種確定陣列長度的情況下。
向量(vector)
向量 Vec<T>
和陣列類似,但不一樣的是,向量是一種可以動態可擴增的陣列,也就是可以任意改變其大小,在裡面放入新的或是刪除元素。
要建立向量也很簡單,可以使用 vec!
巨集來宣告,就像這樣:
1 | let x = vec![1, 3, 5, 7, 9]; |
或是呼叫 Vec::new
來建立,然後將元素放入:
1 | let mut x = Vec::new(); |
以上印出的結果都會是一樣的,可以用 println!()
印出結果,但這裡要特別注意的是,原本這個函式的第一個參數只需要帶入 "{}"
,但因為複合型別跟其他的型別不太一樣,所以如果要印出全部的值的話,可以在 {}
內加入 :?
,這樣就可以印出全部的結果,就像下方範例:
1 | println!("{:?}", x); |
如果要取得特定位置的值,只要使用 []
來存取,並在裡面放入索引值就可以了,就像這樣:
1 | let x = vec![1, 3, 5, 7, 9]; |
索引值也可以使用變數,例如:
1 | let x = vec![1, 3, 5, 7, 9]; |
但是索引值的型別只能使用 usize
,如果使用其他型別會出錯,這邊使用上要特別注意。