天天看點

Rust那些事之Vector妙用

導語

我們知道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由于&的影響,會報錯。