Rust基础07-枚举


枚举

枚举允许我们列举所有可能的值来定义一个类型

  • 定义枚举:

    enum IpAddrKind {
        V4,
        V6,
    }
    
  • 枚举值:

    enum IpAddrKind {
        V4,
        V6,
    }
    
    fn main() {
        let four = IpAddrKind::V4;
        let six = IpAddrKind::V6;
        
        route(four);
        route(six);
        route(IpAddrKind::V6);
    }
    
    fn route(ip_kind: IpAddrKind) {}
    
  • 将数据附加到枚举的变体中:

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

    使用这种方法,不需要额外使用 struct,每个变体可以拥有不同的类型以及关联的数据量

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

    我们还可以在变体中嵌入结构体类型和其他的各种类型

    enum Message {
        Quit,
        Move { x: i32, y: i32},
        Write(String),
        ChangeColor(i32, i32, i32),
    }
    
  • 为枚举定义方法:

    使用 impl 关键字

    impl Message {
        fn call(&self) {}
    }
    
  • Option 枚举:

    定义于标准库中,在Prelude(预导入模块)中,描述了某个值可能存在(某种类型)或不存在的情况

    Rust 中类似 Null 概念的枚举:

    //Option
    enum Option {
        Some(T),
        None,
    }
    

    其包含在Prelude(预导入模块)中,可直接使用

    其相比于 Null 的好处:

    Option 和 T 是不同的类型,不可以把 Option 直接当成T,若想使用 Option 中的 T,必须将它转换为 T

在 Rust 中没有 Null,在其它语言中,Null 是一个值,表示“没有值”,是因某种原因而变为无效或缺失的值;一个变量可以处于两种状态:空值(null)、非空

Null 的问题在于:当你尝试像使用非 Null 值那样使用 Null 值的时候,就会引起某种错误。