定义Enum的完整语法

enum创建枚举类型有多种方式,其每个成员的定义都类似于创建Struct结构的语法。

例如:

#![allow(unused)]
fn main() {
enum E {
  F1,             // 该成员类似于unit-like struct
  F2(i32, u64),   // 该成员类似于tuple struct
  F3{x: i32, y: u64}, // 该成员类似于named struct
}
}

F1成员这种定义方式自无需再多做介绍,前文定义的枚举类型都是这种类型的成员。

F2成员的定义类似于tuple struct,F2成员包含两个字段,这两个字段类型分别是i32和u64。也就是说,枚举类型E的F2成员,是一个包含了具体数据的成员。

F3成员的定义类似于named struct,F3成员包含x和y两个字段,字段类型分别是i32和u64。也就是说,枚举类型E的F3成员,也是一个包含了具体数据的成员。

正是因为枚举类型允许定义F2和F3这种包含数据的成员,使得枚举类型在Rust中扮演的角色变得更为重要。

例如,Rust要实现一个Json解析工具,只需定义一个枚举类型去枚举Json允许的数据类型,参考如下代码。

#![allow(unused)]
fn main() {
enum Json {
  Null,
  Boolean(bool),
  Number(f64),
  String(String),
  Array(Vec<Json>),
  Object(Box<HashMap<String, Json>>),
}
}

不可否认,Rust语言的表达能力很强。例如这里的枚举类型,仅仅这样一个简单的数据结构就表达出很多内容,而在其它语言中,这可能需要定义很多方法来表达出这些内容。