源碼開發(fā)網(wǎng)站建設(shè)市場營銷四大分析方法
目錄
前言
Vector
HashMap
其他
前言
上一課介紹了rust的變量和常見的數(shù)據(jù)類型,走馬觀花的看了一下rust常見的變量和數(shù)據(jù)類型,這些都是rust的基本語法,整理出來只是起一個引子的效果,基本語法多練習(xí)才可以熟練。這一課繼續(xù)介紹rust中的容器類型Vector和HashMap,這也是在工作中使用頻率非常高的。開發(fā)代碼都是這些基本的數(shù)據(jù)結(jié)構(gòu)加上流程控制完成業(yè)務(wù)需求,雖然有些枯燥,但這就是工作。
開始之前,我們依舊使用cargo init lesson3創(chuàng)建一個新項目來保存這節(jié)課的代碼。
Vector
vector,可變數(shù)組,這里的可變是相對于Array而言的,rust中的數(shù)組是長度不可變的,但是vector是長度可變的,類似于java中的ArrayList。關(guān)于vec的定義和增刪改查都在下面代碼中寫了demo和詳細解釋,特殊說明的,在最后幾行我們使用了枚舉和模式匹配,還記得上一課中我們提到的枚舉么,我們使用get方法獲取的結(jié)果是Option,在vscode中可以點開源碼查看Option的定義,它就是我們以后高頻使用的枚舉之一,枚舉和模式匹配搭配一起使用,用來解析Option中是否存在值。
fn main() {// 定義方式1let mut v1: Vec<i32> = Vec::new();// 定義方式2let mut v2: Vec<i32> = vec![1, 2, 3, 4, 5];// 定義方式3let mut v3: Vec<i32> = Vec::with_capacity(5);// 定義方式4let mut v4: Vec<i32> = vec![1; 5]; // [1,1,1,1,1]// 增加元素v1.push(1);// 刪除元素,刪除操作其實在任何工作場景中用的都很少// pop刪除并返回vec的最后一個元素,返回值是一個Option,這個java/scala中的optional// 的含義一致,都是表示也許有也許沒有的意思let last = v2.pop();// remove刪除指定索引位置的元素,并將該元素后面的元素左移let idx0 = v2.remove(0);// 修改元素v1[0] = 2;// 查詢元素println!("v1[0]={}", v1[0]);match v1.get(0) {Some(x) => println!("x={}", x),None => println!("nothing"),}
}
Option的源碼如下:
pub enum Option<T> {/// No value.#[lang = "None"]#[stable(feature = "rust1", since = "1.0.0")]None,/// Some value of type `T`.#[lang = "Some"]#[stable(feature = "rust1", since = "1.0.0")]Some(#[stable(feature = "rust1", since = "1.0.0")] T),
}
HashMap
映射表,也是在工作中使用頻率極高的一種容器。用法在代碼中,HashMap并沒有像vec!一樣的初始化方法,還記得加上感嘆號是宏么,也許在后面我們學(xué)習(xí)到宏的時候,我們自己實現(xiàn)一個hashmap!,我自己都不確定能不能寫到那時候,工作時間越久,越感覺世事無常,一切過往,皆是序章,但愿到時候還有機會和大家可以分享一下hashmap!。
use std::collections::HashMap;fn main() {// 定義方式1let mut h1: HashMap<String, i32> = HashMap::new();// 定義方式2let mut h2: HashMap<String, String> = HashMap::with_capacity(5);// 增/改// insert 如果插入的key不存在,插入成功,返回None,如果插入的key存在,更新成功,返回舊值let r1: Option<i32> = h1.insert("a".to_string(), 1);match r1 {Some(x) => println!("x = {}", x),None => println!("r1 is None"),}let r2: Option<i32> = h1.insert("a".to_string(), 2);match r2 {Some(x) => println!("x = {}", x),None => println!("r2 is None"),}// 刪// remove 成功返回舊值 不存在該key則返回Nonelet r3 = h1.remove("a");match r3 {Some(x) => println!("x = {}", x),None => println!("r3 is None"),}// 查h1.insert("b".to_string(), 2);println!("h1[b]={}", h1["b"]);match h1.get("b") {Some(x) => println!("x = {}", x),None => println!("None"),}
}
其他
rust中還有一些別的容器類型,下圖列舉了rust的collections中的一些容器類型,大家可以在需要使用時自行學(xué)習(xí)了解
//! * Sequences: [`Vec`], [`VecDeque`], [`LinkedList`]
//! * Maps: [`HashMap`], [`BTreeMap`]
//! * Sets: [`HashSet`], [`BTreeSet`]
//! * Misc: [`BinaryHeap`]