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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容