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