Rust枚举体
在Rust编程中,当我们必须从可能的变体列表中选择一个值时,我们使用枚举数据类型。
枚举类型使用 enum 关键词定义,以下是枚举的语法:
enum enum_name { variant1, variant2, variant3 }
例子:使用枚举体
该示例声明一个枚举:GenderCategory,其变体形式为“Male”和“Female”,用print! 宏打印枚举的值。
编译器将抛出一个错误 `GenderCategory` doesn't implement `Debug`,#[derive(Debug)] 用于抑制此错误。
//`derive`属性自动创建实现 //需要使该“枚举”可通过“fmt::Debug”打印。 #[derive(Debug)] enum GenderCategory { Male,Female } fn main() { let male = GenderCategory::Male; let female = GenderCategory::Female; println!("{:?}",male); println!("{:?}",female); }
Male Female
结构体和枚举体
下面的示例定义一个结构Person,gender是GenderCategory类型(这是一个枚举),可以分配Male或者Female作为值。
//`derive`属性会自动创建 implementation //要使此“枚举”可通过以下方式打印 `fmt::Debug`. #[derive(Debug)] enum GenderCategory { Male,Female } //`derive`属性自动创建实现 //需要使该`struct`可以通过`fmt::Debug`打印。 #[derive(Debug)] struct Person { name:String, gender:GenderCategory } fn main() { let p1 = Person { name:String::from("Mohtashim"), gender:GenderCategory::Male }; let p2 = Person { name:String::from("Amy"), gender:GenderCategory::Female }; println!("{:?}",p1); println!("{:?}",p2); }
该示例创建对象 p1 and p2 类型为Person,并初始化每个对象的属性,名称和性别。
Person { name: "Mohtashim", gender: Male } Person { name: "Amy", gender: Female }
Option枚举
Option是Rust标准库中的预定义枚举,该枚举有两个值:有值 和 无值。
语法
enum Option<T> { Some(T), //用于返回值 None //用于返回null,因为Rust不支持null关键字 }
在这里,类型 T 代表任何类型的值。
Rust不支持 null 关键词,但函数可以使用Option枚举返回空值None,如果有数据要返回,函数可以返回Some(T)。
让我们通过一个例子来理解这一点:
该程序定义了一个函数 is_even() ,返回类型为Option。该函数验证传递的值是否为偶数,如果输入为偶数,则返回true,否则返回None。
fn main() { let result = is_even(3); println!("{:?}",result); println!("{:?}",is_even(30)); } fn is_even(no:i32)->Option<bool> { if no%2 == 0 { Some(true) } else { None } }
None Some(true)
匹配语句和枚举
match 语句可用于比较枚举中存储的值。
以下示例定义了一个函数print_size(),需要CarType枚举作为参数,该函数将参数值与一组预定义的常数进行比较,并显示相应的消息。
enum CarType { Hatch, Sedan, SUV } fn print_size(car:CarType) { match car { CarType::Hatch => { println!("Small sized car"); }, CarType::Sedan => { println!("medium sized car"); }, CarType::SUV =>{ println!("Large sized Sports Utility car"); } } } fn main(){ print_size(CarType::SUV); print_size(CarType::Hatch); print_size(CarType::Sedan); }
Large sized Sports Utility car Small sized car medium sized car
与Option匹配
is_even()函数返回Option类型的值,可以使用match语句实现,如下所示:
fn main() { match is_even(5) { Some(data) => { if data==true { println!("Even no"); } }, None => { println!("not even"); } } } fn is_even(no:i32)->Option<bool> { if no%2 == 0 { Some(true) } else { None } }
not even
match和具有数据类型的枚举
可以将数据类型添加到枚举的每个变量中。
在下面的示例中,变量Name和Usr_ID分别是String和integer类型:
//`derive`属性自动创建实现 //需要使该“枚举”可通过“fmt::Debug”打印。 #[derive(Debug)] enum GenderCategory { Name(String),Usr_ID(i32) } fn main() { let p1 = GenderCategory::Name(String::from("Mohtashim")); let p2 = GenderCategory::Usr_ID(100); println!("{:?}",p1); println!("{:?}",p2); match p1 { GenderCategory::Name(val)=> { println!("{}",val); } GenderCategory::Usr_ID(val)=> { println!("{}",val); } } }
Name("Mohtashim") Usr_ID(100) Mohtashim