枚举

定义枚举

fn main() {
    #[derive(Debug)]
    enum Poker {
        Clubs,
        Spades,
        Diamonds
    }

    let card = Poker::Clubs;
    println!("card: {:?}", card);
    println!("spades: {:?}", Poker::Spades);

    fn log(hearts: Poker) {
        println!("hearts: {:?}", hearts)
    }

    log(Poker::Diamonds);
}

枚举值

fn main() {
    #[derive(Debug)]
    struct User {
        name: String,
        age: u8
    }
    #[derive(Debug)]
    struct RGB(u8, u8, u8);
    #[derive(Debug)]
    enum Poker {
        Clubs(u8),
        Spades(bool),
        Diamonds(String),
        Hearts {x: u8, y: u8},
        User(User),
        Rgb(RGB)
    }

    // 我们可以将Poker枚举看作一个信封,而每个枚举值就是信封里的卡片
    // 每个卡片的内容可以不同,有的是数字,有的是字符串,有的是结构体


    // 我们可以在同种类型卡片上填写相关的信息 得到一个填写了信息的卡片
    let card1 = Poker::Clubs(1);
    let card2 = Poker::Spades(false);
    let card3 = Poker::Diamonds(String::from("Diamonds"));
    let card4 = Poker::Hearts {x:3, y:4};

    let card5 = Poker::User(User {
       name: String::from("cxk"),
        age: 18
    });
    let card6 = Poker::Rgb(RGB(0, 0, 0));
    println!("card1: {:?}", card1);
    println!("card2: {:?}", card2);
    println!("card3: {:?}", card3);
    println!("card4: {:?}", card4);
    println!("card5: {:?}", card5);
    println!("card6: {:?}", card6);

    if let Poker::User(user) = card5 {
        // 假设你有一个信封(Poker),里面可能装着一张名片(User)
        // if let 就相当于在说:
        // "如果这个信封里确实装着名片,
        // 那么把名片取出来(命名为user),
        // 然后我要看看这张名片上的姓名和年龄"
        println!("card5 user: {} {}", user.name, user.age);
    }

    if let Poker::Hearts {x, y} = card4 {
        println!("card 4: x: {} y: {}", x, y);
    }

    if let Poker::Rgb(rgb) = card6 {
        let RGB(r, g, b) = rgb;
        println!("card6: {}_{}_{}", r, g, b)
    }

    // 使用match匹配 枚举值
    match card1 {
        Poker::Clubs(c) => println!("card1 clubs: {}", c),
        _ => {} // 表示忽略其他情况
    }

    match card2 {
        Poker::Spades(s) => println!("card2: {}", s),
        _ => {}
    }

    // match匹配时,可以将匹配到的值绑定到一个变量上
    let card3_result = match card3 {
        Poker::Diamonds(d) => {
            println!("card3: {}", d);
            d
        },
        _ => String::from("None")
    };

    println!("card3_result: {}", card3_result);
}

Option

在rust预导入模块中 有一个Option枚举

Option::Some(T) 和 Option::None

Some表示有值,None表示没有值 类似于null

fn main() {
    let car = Some("car");
    let null: Option<i8> = None;
    println!("car: {:?}", car);
    println!("null: {:?}", null);

    if let Some(target) = car {
        println!("car target: {}", target);
    }
}