在Rust编程中,当我们必须从可能的变体列表中选择一个值时,我们使用枚举数据类型,使用 enum 关键字声明枚举类型,以下是enum的语法-
enum enum_name { variant1, variant2, variant3 }
该示例声明一个枚举- GenderCategory ,其值为Male和Female, print!宏显示枚举的值,编译器将抛出错误,因为未针对GenderCategory实现 trait std::fmt::Debug ,属性#[derive(Debug)] 用于抑制此错误。
//`derive` 属性自动创建实现 //需要使用 `fmt::Debug` 使这个 `enum` 可打印。 #[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(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); }
该示例创建Person类型的对象 p1 和 p2 并初始化每个对象的属性,名称和性别。
Person { name: "Mohtashim", gender: Male } Person { name: "Amy", gender: Female }
Option是Rust标准库中的预定义枚举,该枚举有两个值- Some(data)和None。
enum Option<T> { Some(T), //用于返回一个值 None //用于返回 null the null keyword }
在此,类型 T 表示任何类型的值。
Rust不支持 null 关键字,enumOption 中的值 None 可以被函数用来返回空值,如果有要返回的数据,则该函数可以返回 Some(data)。
让我们通过一个示例来理解这一点-
该程序定义一个函数 is_even(),其返回类型为Option,该函数验证传递的值是否为偶数,如果输入为偶数,则返回值true,否则函数返回无。
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
返回 is_even 函数示例也可以使用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
可以将数据类型添加到枚举的每个变体中,在以下示例中,枚举的Name和Usr_ID变体分别为String和integer类型,以下示例说明将match语句与具有数据类型的枚举一起使用。
//需要使用 `fmt::Debug` 使 `enum` 可打印。 #[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
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)