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