免費(fèi)建網(wǎng)站.com的區(qū)別直播營(yíng)銷策略有哪些
8.2.0. 本章內(nèi)容
第八章主要講的是Rust中常見的集合。Rust中提供了很多集合類型的數(shù)據(jù)結(jié)構(gòu),這些集合可以包含很多值。但是第八章所講的集合與數(shù)組和元組有所不同。
第八章中的集合是存儲(chǔ)在堆內(nèi)存上而非棧內(nèi)存上的,這也意味著這些集合的數(shù)據(jù)大小無需在編譯時(shí)就確定,在運(yùn)行時(shí)它們可以動(dòng)態(tài)地變大或變小。
本章主要會(huì)講三種集合:Vector(本文)、String和HashMap
喜歡的話別忘了點(diǎn)贊、收藏加關(guān)注哦(加關(guān)注即可閱讀全文),對(duì)接下來的教程有興趣的可以關(guān)注專欄。謝謝喵!(=・ω・=)
8.2.1. Vector和enum的互補(bǔ)
雖然Vector
它可以動(dòng)態(tài)地變大或變小,但是它里面元素的數(shù)據(jù)類型是必須一樣的,但有的時(shí)候我們需要存儲(chǔ)不同類型的數(shù)據(jù)在堆內(nèi)存上,那這種情況怎么辦呢?
還記得6.1. 定義枚舉中介紹的枚舉類型嗎,枚舉的變體是可以附加數(shù)據(jù)的,而且這些附加的數(shù)據(jù)可以是不同類型。最主要的是,枚舉類型的變體都是定義在同一個(gè)枚舉類型下的,也就是說所有的變體都是同一個(gè)類型,就可以被存儲(chǔ)到Vector
中。
這樣就可以通過枚舉實(shí)現(xiàn)了在Vector
里存儲(chǔ)不同數(shù)據(jù)類型的數(shù)據(jù)的功能。
8.2.2. Vector + enum
來看一個(gè)實(shí)際使用Vector
+枚舉類型的例子:
enum SpreadSheetCell { Int(i32), Float(f64), Text(String),
} fn main() { let row = vec![ SpreadSheetCell::Int(5567), SpreadSheetCell::Text("up up".to_string()), SpreadSheetCell::Float(114.514), ];
}
這個(gè)例子實(shí)現(xiàn)了模擬Excel
單元格的功能,單元格內(nèi)存儲(chǔ)的只能是是整數(shù)、浮點(diǎn)數(shù)和字符串其中之一,所以聲明了SpreadSheetCell
這個(gè)枚舉類型,擁有3個(gè)變體,分別用于存儲(chǔ)整數(shù)(Int
)、浮點(diǎn)數(shù)(Float
)和字符串(String
)。
在main
函數(shù)中,聲明了變量row
用于存儲(chǔ)一行的單元格,因?yàn)橐恍械膯卧駭?shù)量不確定,所以需要Vector
來存儲(chǔ),在這里初始化時(shí)有三個(gè)單元格,第一個(gè)存儲(chǔ)整數(shù)6657,第二個(gè)放了字符串"up up",第三個(gè)放了浮點(diǎn)數(shù)114.514。
通過這個(gè)例子,我們可以看到通過使用可附加數(shù)據(jù)的枚舉類型,就可以變相地在Vector
里存放不同類型的數(shù)據(jù)。
那么Rust為什么在編譯的時(shí)候就需要知道Vector
里的元素的類型呢?因?yàn)檫@樣Rust才能確定堆內(nèi)存上到底需要多少內(nèi)存來容納這個(gè)Vector
。除此之外,如果允許在Vector
上存儲(chǔ)不同類型的元素,那么在對(duì)Vector
上的元素進(jìn)行批量操作時(shí),有些操作可能在某些類型上是合法的而在某些類型上不是,程序就會(huì)出錯(cuò)。而這種枚舉類型配合match
表達(dá)式的方式使得Rust能在編譯時(shí)提前知曉所有的可能情況,在運(yùn)行時(shí)就可以正確處理了。
在這個(gè)例子上Vector
實(shí)現(xiàn)了存儲(chǔ)不同的數(shù)據(jù)類型,但前提條件是我們必須知道到底有哪些數(shù)據(jù)類型(或者叫知道詳盡的數(shù)據(jù)類型),否則的話,如果這個(gè)類型有無限種可能(或者叫不詳盡),那么使用枚舉也沒有辦法,連枚舉都定義不出來。針對(duì)這種情況,Rust提供了trait,但這個(gè)得等到后面講了。