1.什么是枚举
枚举允许我们列举所有可能的值来定义一个类型
2.定义枚举
- ip地址:ipv4,ipv6
 
enum ipaddrkind {
    v4,
    v6,
}
3.枚举值
let four = ipaddrkind::v4;
let six = ipaddrkind::v6;
枚举的变体都位于标识符的命名空间下,使用 :: 进行分隔
enum ipaddrkind {
    v4,
    v6,
}
fn main() {
    let four = ipaddrkind::v4;
    let six = ipaddrkind::v6;
    ip_route(four);
    ip_route(six);
    ip_route(ipaddrkind::v6);
    println!("Hello, world!");
}  
fn ip_route(ipkind: ipaddrkind) {
}
4.将数据附加到枚举的变体中
这样做的好处是不用再额外定义结构体
enum ipaddinfo {
    v4(u8,u8,u8,u8),
    v6(String),
}
fn main() {
    let home = ipaddinfo::v4(127, 0, 0, 1);
    let school = ipaddinfo::v6(String::from("2"));
}
5.标准库中的IpAddr
我们可以在枚举的变体中嵌入任意类型的数据
标准库中的就是嵌入了一个结构体
struct Ipv4Addr {
}
struct Ipv6Addr {
}
enum IpAddr {
    V4(Ipv4Addr),
    V6(Ipv6Addr),
}
6.为枚举定义方法
使用impl关键字为枚举定义方法
#[derive(Debug)]
enum ipaddinfo {
    v4(u8,u8,u8,u8),
    v6(String),
}
impl ipaddinfo {
    fn outip(&self) {
        println!("{:#?}",&self);
    }
}
fn main() {
    let home = ipaddinfo::v4(127, 0, 0, 1);
    let school = ipaddinfo::v6(String::from("2"));
    home.outip();
}