05_Rust 中的Enum(枚举)

87 阅读1分钟

Rust中的枚举是一组类型的枚举,或者可以说是多个子类型公用一个枚举类型。适用的场景是:一组有着共同点的类型,但是每个类型又有许多不同,而且同一时刻相互之间互斥。

基本使用介绍

比如:IP有两个版本,IPV6 & IPV4。这两个版本同样是IP的版本号,并且同一个值只会是其中一种类型,那么这时候就可以使用枚举。定义方式如下。

enum IpAddrKind {
    V4,
    V6,
}

使用Enum实例化变量

fn main() {
    let four = IpAddrKind::V4;
    let six = IpAddrKind::V6;
}

V4和V6在函数传参的时候,都可以算作一个类型 IpAddrKind。

enum IpAddrKind {
    V4,
    V6,
}

fn route(ip_kind: IpAddrKind) {}

fn main() {
    route(IpAddrKind::V4);
    route(IpAddrKind::V6);
}

在枚举中添加类型

接着👆的例子,我们可以进一步这样定义枚举

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

这样就可以直接将具体的值添加到枚举变量中

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

fn main(){
    let home = IpAddr::V4(String::from("127.0.0.1"));
}

在枚举中添加的类型是多样的,可以是tuple、struct,甚至可以是另一个枚举。

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

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

另一个例子

enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
    ChangeColor(i32, i32, i32),
}

给enum添加impl

我们可以给struct添加impl,定义funcitons,同样也可以使用在enum上。

enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
    ChangeColor(i32, i32, i32),
}

impl Message {
    fn call(&self) {
        // method body would be defined here
    }
}

fn main(){
    let m = Message::Write(String::from("hello"));
    m.call();
}

这样给数据类型带来了极大的丰富性。