枚举模式与match

2021-08-22  本文已影响0人  简书网abc

1,枚举的定义与基本使用

具体可以参考该文档:
https://rust.bootcss.com/ch06-01-defining-an-enum.html

fn main() {
    enum Book {
        Nothing,
        Papery {index: u32},
        Electronic {url: String, price: u32},
    }

    let _not = Book::Nothing;
    let _book = Book::Papery {index: 100};
    let _ebook = Book::Electronic {url: String::from("url..."), price: 34};

    match _ebook {
        Book::Nothing => {
            println!("nothing");
        },
        Book::Papery { index} => {
            println!("Papery book {}", index);
        },
        Book::Electronic { url, price} => {
            println!("E-book is {}, price = {}", url, price);
        }
    }
}

2, Option枚举类

如果你想定义一个可以为空值的类,你可以这样:
let opt = Option::Some("Hello");
如果你想针对 opt 执行某些操作,你必须先判断它是否是 Option::None:

fn main() {
    let opt = Option::Some("Hello");
    match opt {
        Option::Some(something) => {
            println!("{}", something);
        },
        Option::None => {
            println!("opt is nothing");
        }
    }
}

如果你的变量刚开始是空值,你体谅一下编译器,它怎么知道值不为空的时候变量是什么类型的呢?

所以初始值为空的 Option 必须明确类型:

fn main() {
    let opt: Option<&str> = Option::None;
    match opt {
        Option::Some(something) => {
            println!("{}", something);
        },
        Option::None => {
            println!("opt is nothing");
        }
    }
}

或者使用简介写法

fn main() {
    let t = Some(64);
    match t {
        Some(t) => println!("{}", t),
        _ => println!("No"),
    }
}

3, if let 语法

fn main() {
    let i = 0;
    match i {
        0 => println!("zero"),
        _ => {},
    }

    let i = 1;
    if let 1 = i {
        println!("zero");
    } else {
        println!("no zero");
    }

    enum Book {
        Papery(u32),
        Electronic(String)
    }
    let book = Book::Electronic(String::from("url ... "));
    if let Book::Papery(index) = book {
        println!("Papery {}", index);
    } else if let Book::Electronic(url) = book{
        println!("Electronic url : {}", url);
    } else {
        println!("No thinking");
    }
}

上一篇 下一篇

猜你喜欢

热点阅读