導語
我們知道vector是一個動态數組,在C++中來說,vector中存儲的隻能是一種類型,那如何做到存儲多個,無非就是包一層,例如:結構體、
void*
。而在Rust中enum非常獨特,每個值可以是不同類型,是以我們從enum來考慮。另一方面,幾種不同的方式從vector中讀取有何不同呢?
1.vector執行個體
例如:一個enum包含了不同類型
#[derive(Debug)]
enum Spec {
Int(i32),
Float(f64),
Bool(bool),
Text(String),
}
調用:
pub fn mult_type() {
let r = vec![Spec::Int(1), Spec::Float(2.2), Spec::Bool(true), Spec::Text(String::from("hello"))];
println!("{:?}", r)
}
這樣便可以簡單的完成一個vector使用不同類型。
2. &
執行個體
&
vector中,你可以取其中的元素,有下面幾個方法:
v[2]
&v[2]
v.get(2)
這三個有什麼差別?
前兩個很明顯,跟傳統的擷取元素一緻,如果下标越界,便會panic,而get使用了
Option<T>
特殊枚舉,在越界情況下會傳回None,不會panic,足以說明Rust的安全性。
因為v.get傳回的是Option,我們可以使用match控制流,提取出包裹的内容。
match v.get(2) {
Some(x) => println!("{}", x),
None => println!("None")
}
接下來,我們考慮
v[2]
與
&v[2]
的差別。
// case1: &
let mut v = vec![1, 2, 3, 4, 5];
let first = &v[0];
v.push(6);
println!("The first element is: {}", first);
// case2: plain
let mut v = vec![1, 2, 3, 4, 5];
let first = v[0];
v.push(6);
println!("The first element is: {}", first);
考慮上述兩個case,在push的時候哪個case是正常的?
答案是第二個case會正常運作,第一個case由于&的影響,會報錯。