Rust 入門 - Enum

定義

enum IpAddrkind {
    V4,
    V6,
}

struct IpAddr {
    kind: IpAddrkind,
    address: String,
}

使用
注意枚舉的成員位于其標識符的命名空間中靶草,并使用兩個冒號分開。

let four = IpAddrkind::V4;
let six = IpAddrkind::V6;

let home = IpAddr {
    kind: IpAddrkind::V4,
    address: String::from("127.0.0.1"),
};

let loopback = IpAddr {
    kind: IpAddrkind::V6,
    address: String::from("::1"),
};

更簡潔的方式


enum IpAddress {
    V4(String),
    V6(String),
}

let home = IpAddress::V4(String::from("127.0.0.1"));
let loopback = IpAddress::V6(String::from("::1"));

優(yōu)化版本岳遥,讓代碼有更多的意義

enum Ip {
    V4(u8, u8, u8, u8),
    V6(String),
}

let home = Ip::V4(127, 0, 0, 0);
let loopback = Ip::V6(String::from("::1"));

嵌入多種類型

// Quit 沒有關(guān)聯(lián)任何數(shù)據(jù)奕翔。
// Move 包含一個匿名結(jié)構(gòu)體。
// Write 包含單獨一個 String浩蓉。
// ChangeColor 包含三個 i32派继。
enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
    ChangeColor(i32, i32, i32),
}

let m = Message::Write(String::from("hello"));
m.call();


// 結(jié)構(gòu)體和枚舉還有另一個相似點:就像可以使用 impl 來為結(jié)構(gòu)體定義方法那樣,也可以在枚舉上定義方法捻艳。
impl Message {
    fn call(&self) {}
}

Option 枚舉和其相對于空值的優(yōu)勢
Rust 中沒有空值驾窟,不過它確實擁有一個可以編碼存在或不存在概念的枚舉。這個枚舉是 Option<T>认轨,而且它定義于標準庫中

let some_number = Some(5);
let some_string = Some("a string");
let absent_number: Option<i32> = None;
println!("{:?}, {:?}, {:?}", some_number, some_string, absent_number);

match 控制流運算符

let res = value_in_cents(Coin::Penny);
println!("res:{:?}", res);

enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter,
}

fn value_in_cents(coin: Coin) -> u8 {
    match coin {
        Coin::Penny => {
            println!("Lucky penny!");
            1
        }
        Coin::Nickel => 5,
        Coin::Dime => 10,
        Coin::Quarter => 25,
    }
}

綁定值的模式

let res = value_in_cents1(Coin1::Quarter(UsState::Alabama));
println!("res = {}", res);

fn value_in_cents1(coin: Coin1) -> u8 {
    match coin {
        Coin1::Penny => {
            println!("Lucky penny!");
            1
        }
        Coin1::Nickel => 5,
        Coin1::Dime => 10,
        Coin1::Quarter(state) => {
            println!("State quarter from {:?}!", state);
            25
        }
    }
}

#[derive(Debug)]
enum UsState {
    Alabama,
    Alaska,
}

enum Coin1 {
    Penny,
    Nickel,
    Dime,
    Quarter(UsState),
}


匹配 Option<T>

let five = Some(5);
let six = plus_one(five);
let none = plus_one(None);
println!("five = {:?}, six = {:?}, none = {:?}", five, six, none);

fn plus_one(x: Option<i32>) -> Option<i32> {
    match x {
        None => None,
        Some(i) => Some(i + 1),
    }
}

_ 通配符

可以使用特殊的模式 _ 替代 默認

let some_u8_value = 0u8;
match some_u8_value {
    1 => println!("one"),
    3 => println!("three"),
    5 => println!("five"),
    7 => println!("seven"),
    _ => println!("Ignore"),
}

if let 簡單控制流

let some_u8_value = Some(0u8);
println!("{:?}", some_u8_value);
match some_u8_value {
    Some(3) => println!("theree"),
    _ => (),
}

簡潔寫法

if let Some(3) = some_u8_value {
    println!("Three");
} else {
    println!("Default");
}

可以認為 if let 是 match 的一個語法糖

let coin = Coin1::Quarter(UsState::Alabama);
let mut count = 0;
match coin {
    Coin1::Quarter(state) => println!("State quarter from {:?}!", state),
    _ => count += 1,
}

用if let 寫法

let coin = Coin1::Quarter(UsState::Alaska);
if let Coin1::Quarter(state) = coin {
    println!("State quarter from {:?}!", state);
} else {
    count += 1;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绅络,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恩急,老刑警劉巖节视,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異假栓,居然都是意外死亡寻行,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門匾荆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拌蜘,“玉大人,你說我怎么就攤上這事牙丽〖蛭裕” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵烤芦,是天一觀的道長举娩。 經(jīng)常有香客問我,道長构罗,這世上最難降的妖魔是什么铜涉? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮遂唧,結(jié)果婚禮上芙代,老公的妹妹穿的比我還像新娘。我一直安慰自己盖彭,他們只是感情好纹烹,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著召边,像睡著了一般铺呵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上隧熙,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天片挂,我揣著相機與錄音,去河邊找鬼贱鼻。 笑死宴卖,一個胖子當著我的面吹牛滋将,可吹牛的內(nèi)容都是我干的邻悬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼随闽,長吁一口氣:“原來是場噩夢啊……” “哼父丰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤蛾扇,失蹤者是張志新(化名)和其女友劉穎攘烛,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镀首,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡坟漱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了更哄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芋齿。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖成翩,靈堂內(nèi)的尸體忽然破棺而出觅捆,到底是詐尸還是另有隱情,我是刑警寧澤麻敌,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布栅炒,位于F島的核電站,受9級特大地震影響术羔,放射性物質(zhì)發(fā)生泄漏赢赊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一级历、第九天 我趴在偏房一處隱蔽的房頂上張望域携。 院中可真熱鬧,春花似錦鱼喉、人聲如沸秀鞭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锋边。三九已至,卻和暖如春编曼,著一層夾襖步出監(jiān)牢的瞬間豆巨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工掐场, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留往扔,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓熊户,卻偏偏與公主長得像萍膛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子嚷堡,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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

  • 通用編程概念 變量與可變性 變量默認不可變蝗罗,如需要改變,可在變量名前加 mut 使其可變。例如:let mut a...
    soojade閱讀 12,540評論 2 30
  • Rust 語言部分細節(jié) 以大見小 - Rust快速實踐(一)- 主觀感受[https://www.jianshu....
    卷邊芝士閱讀 1,648評論 0 1
  • 緣起 實踐出真知快速獲取澄清概念OwnershipMoveReferenceMutable reference解釋...
    lambeta閱讀 11,104評論 2 19
  • 變量 聲明變量關(guān)鍵字:let 變量值分為兩種類型: 可變的(mut) 不可變 變量類型: 布爾型 - bool 表...
    JennerHua閱讀 873評論 0 4
  • 引言 本文內(nèi)容主要翻譯自 Andrew Gallant 的文章 Error Handling in Rust串塑。 如...
    0xE8551CCB閱讀 2,827評論 1 3