• 多种类型的集合体,一个类型的变量可以存储多种类型的值,枚举的每一项都是该枚举类型的变体:

    enum IpAddrKind {
    	V4,
    	V6,
    }
    
    fn main() {
    	route(IpAddrKind::V4);
    	route(IpAddrkind::V6);
    }
    
    fn route(kind: IpAddrKind) {
    	// ...
    }
    
  • 枚举的每一个变体都可以直接包含数据,并且每一个变体可以包含不同的数据类型和不同的数量,甚至可以直接放结构体(也可以是匿名的)。

    struct Ipv4Addr {
    	// --snip--
    }
    
    enum IpAddr {
    	V4(Ipv4Addr),
    	V6(String),
    }
    
    let home = IpAddr::V4(127, 0, 0, 1);
    let loopback = IpAddr::V6(String::from("::1"));
    
    struct Message {
    	Quit,
    	Move{ x: i32, y: i32 },       // anonymous struct
    	Write(String),
    	ChangeColor(i32, i32, i32),   // three i32 values
    }
    
  • 枚举也可以通过 impl 实现方法

    impl Message {
    	fn call(&self) {
    			match self {
    				// ...
    			}
    	}
    }
    
    let m = Message::Write(String::from("hello"));
    m.call();
    
  • Option

    enum Option<T> {
    	Some(T),
    	None,
    }
    

    由于 Option 很重要,所以已经在 prelude 包含,也就是说无需使用 Option:: 前缀就可以直接使用 SomeNone

    let some_number = Some(5);
    let some_number: Option<i32> = Some(5);
    let some_number: Option<i32> = Option<i32>::Some(5);
    
    let some_number: Option<i32> = None;
    let some_number: Option<i32> = Option::None;