枚举

可以给成员添加元组属性,属性类型可以相同,也可以不同。

enum FRUIT {
    APPLE = 0, 
    BANANA = 1, 
    ORANGE = 2, 
    GRAPE =3,
}

#[derive(Debug)]
enum IPADDR {
    V4(u8,u8,u8,u8),
    V6(String),
}

let myFavorite = FRUIT::APPLE;

println!("My favorite fruit is {:?}",myFavorite);
println!("{:?} value is {:?}", FRUIT::APPLE, FRUIT::APPLE as i32);

let myIP = IPADDR::V4(192,168,21,1);

println!("My ip addr:{:?}", myIP);

通过match可以对enum中的值做相应处理,match不仅对enum也可以对基础类型进行对应处理。match可以看作是C/C++的switch(不需要break,每次匹配到对应的值处理完后自动break)

match myFavorite {
    FRUIT::APPLE => {
        println!("Red");
    },
    FRUIT::BANANA => {
        println!("Yellow");
    },
    FRUIT::ORANGE => {
        println!("Orange");
    },
    FRUIT::GRAPE => {
        println!("Purple");
    },
}

match的default的选项处理使用"_",表示除去上面列出的选项外所有值。

    let num = 25;

    match num {
        0..=9 => {
            println!("Num in [0..9]");
        },

        10..=50 => {
            println!("Num in [10..50]");
        },

        51..=100 => {
            println!("Num in [51..100]");
        },
        _ => {
            println!("Num out of valid range [0..100]");
        }
    }

因为rust为了安全取消了null,但是在默写特殊情况下null仍然十分方便。rust引入了None,None同样是一个确认值。例如一个函数,根据计算结果返回值,但如果出现异常或者参数错误,则返回无效None

enum ReturnOption{
    Some(u32),
    None,
}

fn retValue(num:u32) -> ReturnOption {
    match num {
        0..=9 => {
            println!("Num in [0..9]");
            return ReturnOption::Some(0);
        },

        10..=50 => {
            println!("Num in [10..50]");
            return ReturnOption::Some(1);
        },

        51..=100 => {
            println!("Num in [51..100]");
            return ReturnOption::Some(2);
        },
        _ => {
            println!("Num out of valid range [0..100]");
            return ReturnOption::None;
        }
    }
}

使用unwrap方法可以将Some()中的数值取出

    let x = Some(33);

    println!("{}",x.unwrap())

麦穗儿
127 声望15 粉丝

程序猿以技术为本