RUST 學(xué)習(xí)日記 第24課 ——枚舉類(lèi)型

0x00 回顧

上篇文章咱們介紹了結(jié)構(gòu)體餐塘,結(jié)構(gòu)體類(lèi)型是一種自定義的數(shù)據(jù)類(lèi)型,當(dāng)然也可以把 多個(gè)類(lèi)型組合在一起成為新的類(lèi)型皂吮。本篇文章介紹另一種自定義數(shù)據(jù)類(lèi)型——枚舉(enum)戒傻。一起來(lái)看看它和結(jié)構(gòu)體又有什么區(qū)別吧

0x01 定義

枚舉類(lèi)型是一種自定義的數(shù)據(jù)類(lèi)型,使用 **enum **關(guān)鍵字 + 自定義的命名 + 枚舉值來(lái)定義蜂筹。我們通過(guò)使用 枚舉名 :: 枚舉值 來(lái)訪(fǎng)問(wèn)枚舉的值需纳。使用場(chǎng)景:當(dāng)一個(gè)參數(shù)可能存在多個(gè)取值范圍時(shí),我們定義成枚舉類(lèi)型來(lái)控制變量的取值范圍艺挪,從而防止輸入非法值不翩。示例代碼如下:

// 枚舉示例代碼
// 聲明一個(gè)星期的枚舉類(lèi)型,只有7天麻裳,周一到周日口蝠。
enum Week {
    Mon,
    Tue,
    Wed,
    Thu,
    Fri,
    Sat,
    Sun
}

0x02 C 式枚舉

上面的示例代碼,就是Rust中最簡(jiǎn)單的枚舉類(lèi)型了津坑,同 **C 語(yǔ)言 **一模一樣妙蔗。在內(nèi)存中,C 式枚舉的值存儲(chǔ)為整數(shù)疆瑰,默認(rèn)從0開(kāi)始眉反,后面的值依次 +1。如果想更改某個(gè)枚舉的值穆役,需要告訴它用什么整數(shù)寸五。示例代碼如下:

// 為了可以格式化打印枚舉值,需要加入下面這行代碼耿币,具體有關(guān) trait 的知識(shí)將在后面介紹梳杏。
#[derive(Debug)]
enum Week {
    Mon,
    Tue,
    Wed,
    Thu = 300,
    Fri,
    Sat,
    Sun
}

fn main() {
    // 打印枚舉類(lèi)型
    println!("{:?}", Week::Wed);
    // 打印枚舉的值
    println!("{}", Week::Wed as i32);

    println!("{}", Week::Mon as i32);

    // 由于Thu 賦值維 300, 則后面的值依次+1
    println!("{}", Week::Fri as i32);
}

// 輸出結(jié)果:
// Wed
// 2
// 0
// 301

0x03 包含數(shù)據(jù)的枚舉

在 Rust 中,枚舉的值存在 3 種變體掰读,分別對(duì)應(yīng)前兩篇文章介紹的 3 種結(jié)構(gòu)體秘狞。沒(méi)有數(shù)據(jù)的變體對(duì)應(yīng)類(lèi)基元結(jié)構(gòu)體,元組變體的寫(xiě)法和作用同元組結(jié)構(gòu)體一樣蹈集,結(jié)構(gòu)體變體則存在花括號(hào)和命名字段烁试。在一個(gè)枚舉里可以同時(shí)存在3 種變體。

#[derive(Debug)]
enum Color {
    // 定義色值拢肆,參數(shù)分別表示16進(jìn)制顏色代碼减响,R靖诗,G,B
    White(String, u8, u8, u8),
    Red,
    Black { code: String, r: u8, g: u8, b: u8 },
}

fn main() {
    let white = Color::White(String::from("#FFFFFF"), 255, 255, 255);
    let red = Color::Red;
    let black = Color::Black { code: String::from("#000000"), r: 0, g: 0, b: 0 };
    println!("{:?}", white);
    println!("{:?}", red);
    println!("{:?}", black);   

    // 輸出結(jié)果:
    // White("#FFFFFF", 255, 255, 255)
    // Red
    // Black { code: "#000000", r: 0, g: 0, b: 0 }
}

0x04 枚舉的內(nèi)存布局

我們以 Week 為例支示,來(lái)看下枚舉在內(nèi)存中的布局吧刊橘。廢話(huà)不多說(shuō),先上圖颂鸿,后解釋促绵。


不知道大家能不能看懂呢。首先如果一個(gè)枚舉類(lèi)型存在多個(gè)枚舉值嘴纺,那么它會(huì)為每個(gè)枚舉值分配一個(gè)標(biāo)簽败晴,從0開(kāi)始計(jì)數(shù),占1字節(jié)栽渴。我們每個(gè)枚舉值尖坤,還有3個(gè)u8類(lèi)型的值,每個(gè)類(lèi)型占1字節(jié)闲擦。由于對(duì)齊原因慢味,留空4字節(jié),對(duì)齊8字節(jié)(有關(guān)Rust內(nèi)存對(duì)齊的問(wèn)題墅冷,我找時(shí)間單獨(dú)一篇文章介紹)纯路。最后String占24字節(jié),關(guān)于String的內(nèi)存模型寞忿,我已經(jīng)在前面講過(guò)了感昼。Week 總共占 32 字節(jié)
最后罐脊,我們通過(guò)編譯器驗(yàn)證下內(nèi)存數(shù)據(jù)。如下圖:

另外蜕琴,如果一個(gè)枚舉類(lèi)型僅存在一個(gè)枚舉值萍桌,那么他不會(huì)存在占一個(gè)字節(jié)的標(biāo)簽。大家可通過(guò)編譯器自行驗(yàn)證凌简。我在這里就不做贅述了上炎。
注:上面的內(nèi)存模型是以 Rust 1.62.1 版本為基礎(chǔ)的。Rust 后續(xù)依然可能會(huì)對(duì)枚舉的內(nèi)存作出優(yōu)化雏搂。

0x05 小結(jié)

枚舉類(lèi)型到這里就介紹完了藕施,其實(shí)枚舉在任何項(xiàng)目中都是很常見(jiàn)的。本篇文章主要介紹了枚舉的定義和內(nèi)存布局凸郑,使用枚舉的是為了必須保證安全的訪(fǎng)問(wèn)數(shù)據(jù)裳食,在某些場(chǎng)景下大概率會(huì)同模式匹配一起使用。
介紹了枚舉類(lèi)型之后芙沥,Rust 常用的數(shù)據(jù)類(lèi)型已經(jīng)介紹完了诲祸。之后的文章將進(jìn)入 Rust 中級(jí)階段浊吏,了解 Rust 的泛型,Trait救氯,所有權(quán)指針等等找田。接下來(lái)的文章將是真正揭開(kāi) Rust 神秘面紗的時(shí)刻。

0x06 本節(jié)源碼

024 · StudyRust - 碼云 - 開(kāi)源中國(guó) (gitee.com)

從下一篇文章開(kāi)始進(jìn)入中級(jí)教程

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末着憨,一起剝皮案震驚了整個(gè)濱河市墩衙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌甲抖,老刑警劉巖漆改,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異惧眠,居然都是意外死亡籽懦,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)氛魁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)暮顺,“玉大人,你說(shuō)我怎么就攤上這事秀存〈仿耄” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵或链,是天一觀的道長(zhǎng)惫恼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)澳盐,這世上最難降的妖魔是什么祈纯? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮叼耙,結(jié)果婚禮上腕窥,老公的妹妹穿的比我還像新娘。我一直安慰自己筛婉,他們只是感情好簇爆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著爽撒,像睡著了一般入蛆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上硕勿,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天哨毁,我揣著相機(jī)與錄音,去河邊找鬼源武。 笑死挑庶,一個(gè)胖子當(dāng)著我的面吹牛言秸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播迎捺,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼举畸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了凳枝?” 一聲冷哼從身側(cè)響起抄沮,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎岖瑰,沒(méi)想到半個(gè)月后叛买,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蹋订,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年率挣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片露戒。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡椒功,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出智什,到底是詐尸還是另有隱情动漾,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布荠锭,位于F島的核電站旱眯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏证九。R本人自食惡果不足惜删豺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望愧怜。 院中可真熱鬧吼鳞,春花似錦、人聲如沸叫搁。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)渴逻。三九已至,卻和暖如春音诫,著一層夾襖步出監(jiān)牢的瞬間惨奕,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工竭钝, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留梨撞,地道東北人雹洗。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像卧波,于是被迫代替她去往敵國(guó)和親时肿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容