Rust那些事之Vector妙用
?導語
我們知道vector是一個動態數組,在C++中來說,vector中存儲的只能是一種類型,那如何做到存儲多個,無非就是包一層,例如:結構體、void*。而在Rust中enum非常獨特,每個值可以是不同類型,因此我們從enum來考慮。另一方面,幾種不同的方式從vector中讀取有何不同呢?
1.vector實例
例如:一個enum包含了不同類型
調用:
這樣便可以簡單的完成一個vector使用不同類型。
2.&實例
vector中,你可以取其中的元素,有下面幾個方法:
這三個有什么區別?
前兩個很明顯,跟傳統的獲取元素一致,如果下標越界,便會panic,而get使用了Option<T>特殊枚舉,在越界情況下會返回None,不會panic,足以說明Rust的安全性。
因為v.get返回的是Option,我們可以使用match控制流,提取出包裹的內容。
接下來,我們考慮v[2]與&v[2]的區別。
考慮上述兩個case,在push的時候哪個case是正常的?
答案是第二個case會正常運行,第一個case由于&的影響,會報錯。
在 vector 的結尾增加新元素時,在沒有足夠空間將所有元素依次相鄰存放的情況下,可能會要求分配新內存并將老的元素拷貝到新的空間中。這時,第一個元素的引用就指向了被釋放的內存。借用規則阻止程序陷入這種狀況。
此時便會報錯:error: cannot borrow v as mutable because it is also borrowed as immutable。