新聞中心
?導(dǎo)語(yǔ)
我們知道vector是一個(gè)動(dòng)態(tài)數(shù)組,在C++中來(lái)說(shuō),vector中存儲(chǔ)的只能是一種類型,那如何做到存儲(chǔ)多個(gè),無(wú)非就是包一層,例如:結(jié)構(gòu)體、void*。而在Rust中enum非常獨(dú)特,每個(gè)值可以是不同類型,因此我們從enum來(lái)考慮。另一方面,幾種不同的方式從vector中讀取有何不同呢?

成都創(chuàng)新互聯(lián)長(zhǎng)期為近千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為陽(yáng)江企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、成都網(wǎng)站制作,陽(yáng)江網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
1.vector實(shí)例
例如:一個(gè)enum包含了不同類型
#[derive(Debug)]
enum Spec {
Int(i32),
Float(f64),
Bool(bool),
Text(String),
}
調(diào)用:
pub fn mult_type() {
let r = vec![Spec::Int(1), Spec::Float(2.2), Spec::Bool(true), Spec::Text(String::from("hello"))];
println!("{:?}", r)
}這樣便可以簡(jiǎn)單的完成一個(gè)vector使用不同類型。
2.&實(shí)例
vector中,你可以取其中的元素,有下面幾個(gè)方法:
v[2]
&v[2]
v.get(2)
這三個(gè)有什么區(qū)別?
前兩個(gè)很明顯,跟傳統(tǒng)的獲取元素一致,如果下標(biāo)越界,便會(huì)panic,而get使用了Option
因?yàn)関.get返回的是Option,我們可以使用match控制流,提取出包裹的內(nèi)容。
match v.get(2) {
Some(x) => println!("{}", x),
None => println!("None")
}接下來(lái),我們考慮v[2]與&v[2]的區(qū)別。
// 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);
考慮上述兩個(gè)case,在push的時(shí)候哪個(gè)case是正常的?
答案是第二個(gè)case會(huì)正常運(yùn)行,第一個(gè)case由于&的影響,會(huì)報(bào)錯(cuò)。
在 vector 的結(jié)尾增加新元素時(shí),在沒(méi)有足夠空間將所有元素依次相鄰存放的情況下,可能會(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。
名稱欄目:Rust那些事之Vector妙用
文章URL:http://www.dlmjj.cn/article/coohjcp.html


咨詢
建站咨詢
