Rust學習(15):枚舉【if let沒弄懂】

1、兩種枚舉

enum枚舉和它的方法

1、一個簡單的枚舉

enum IpAddr{
    V4(u32, u32, u32, u32),
    V6(String),
}

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

2、枚舉可以將任意類型的數據放入枚舉成員中:例如字符串、數字類型或者結構體,甚至可以包含另一個枚舉
3、枚舉也有方法

enum Message {
    Quit,     //Quit 沒有關聯任何數據
    Move { x: i32, y: i32 },  //包含一個匿名結構體。
    Write(String),
    ChangeColor(i32, i32, i32),
}

impl Message{
    fn call(&self){
       
    }
}

Option枚舉與空值

空值是一個因爲某種原因目前無效或者缺失的值。Rust中沒有空值,不過它在標準庫中定義了一個可以編碼存在或者不存在概念的枚舉Option。實現如下:

enum Option<T> { 
    Some(T), 
    None,
}

< T>是一個泛型參數,意味着Option枚舉的some成員可以包含任意類型的數據。
Option< T>枚舉被包含在了prelude中,因此我們不需要將其顯示引入作用域就可以直接使用:


fn main() {
    let s_string = Some("String");
    let x:Option<i8> = Some(5); //存在一個值,而這個值保存在 Some 中
    let a_num:Option<i32> = None; //None跟空值具有相同的意義

    //Option<T> 和 T(這裏 T 可以是任何類型)是不同的類型,編譯器不允許像一個肯定有效的值那樣使用 Option<T>
    let y:i8 = 5; //一般變量,編譯器總是能夠確保這樣的值是有效的
    //let sum = x + y;  //error[E0369]: binary operation `+` cannot be applied to type `std::option::Option<i8>`。Rust不知道該如果將Option<i8>和i8相加,因爲它們的類型不同
}

如果想要使用Option< T>的值,我們必須處理每個成員的代碼[可以通過match]:從Some(T)中取出T的值,或者處理None時值爲空的情況。不必擔心不小心錯誤的使用了空值

2、枚舉與Match

match是一個控制流運算符,它允許我們將一個值與一系列的模式相比較並根據相匹配的模式執行相應的代碼。模式可由字面值、變量、通配符和許多其他內容組成。

enum與match

#[derive(Debug)]  //`derive`  only can be applied to structs, enums and unions
enum UsState{
    Alibame,
    Aliska,
    Vermonut,
    Cormount,
}
enum Coin{
    Penny,
    Nickel,
    Dime,
    Quarter(UsState),
}

fn value_in_cents(coin:Coin)->u32{
    match  coin{
        Coin::Penny =>1,  //按順序與每一個分支的模式相比較
        Coin::Nickel=>5,  //macth會自動窮盡所有的enum值,比如如果刪除Coin::Nickel=>5,編譯器就會報錯
        Coin::Dime=>10,   //分支代碼較短:不使用大括號
        Coin::Quarter(state) =>{
            println!("Quarter from {:?}", state);
            return 25;
        }
    }
}
fn main() {
    let value = value_in_cents(Coin::Quarter(UsState::Alibame));
    println!("{}", value);
}

Option< T>與match

fn plus_one(x:Option<i32>)->i32{
    match x {
        None => -999999,
        Some(i) =>i,
    }
}
fn main() {
    let value = plus_one(Some(5));
    println!("{}", value);
}

_通配符與match

_ 模式會匹配所有的值。通過將其放置於其他分支之後,_ 將會匹配所有之前沒有指定的可能的值

fn match_u8(x:u8){
    match x {
        1 => println!("One"),
        3 => println!("three"),
        5 => println!("five"),
        7 => println!("seven"),
        _ => println!("Other"),
    }
}
fn main() {
    match_u8(2u8); //Other
     match_u8(11u8); //Other
}

總結:

  • match一個枚舉,綁定其中的值到一個變量,接着根據其值匹配代碼。跟switch相似
  • march只關心一個情況裏面場景

3、if let語法糖

if let 是 match 的一個語法糖,它當值匹配某一模式時執行代碼而忽略所有其他值。

沒弄懂用法

參考:https://kaisery.github.io/trpl-zh-cn/ch06-02-match.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章