Rust 枚举
在Rust编程中,当我们需要从一个可能的变体列表中选择一个值时,我们使用枚举数据类型。枚举类型使用 enum 关键字声明。下面是枚举的语法−
enum enum_name {
variant1,
variant2,
variant3
}
示例:使用枚举
该示例声明了一个名为 GenderCategory 的枚举,其变体为 Male 和 Female。print! 宏显示枚举的值。如果未为 GenderCategory 实现 std::fmt::Debug 特性,则编译器将抛出错误。使用属性 #[derive(Debug)] 可以抑制此错误。
// The `derive` attribute automatically creates the implementation
// required to make this `enum` printable with `fmt::Debug`.
#[derive(Debug)]
enum GenderCategory {
Male,Female
}
fn main() {
let male = GenderCategory::Male;
let female = GenderCategory::Female;
println!("{:?}",male);
println!("{:?}",female);
}
输出
Male
Female
Struct 和 Enum
以下示例定义了一个名为Person的结构体。字段gender的数据类型是GenderCategory枚举,可以被赋值为Male或Female。
// The `derive` attribute automatically creates the
implementation
// required to make this `enum` printable with
`fmt::Debug`.
#[derive(Debug)]
enum GenderCategory {
Male,Female
}
// The `derive` attribute automatically creates the implementation
// required to make this `struct` printable with `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);
}
这个示例创建了类型为 Person 的对象 p1 和 p2,并为每个对象初始化了属性 name 和 gender。
输出
Person { name: "Mohtashim", gender: Male }
Person { name: "Amy", gender: Female }
选项枚举
选项是Rust标准库中的预定义枚举。该枚举有两个值:Some(数据)和None。
语法
enum Option<T> {
Some(T), //used to return a value
None // used to return null, as Rust doesn't support
the null keyword
}
这里,类型T
代表任何类型的值。
Rust不支持null
关键字。在enum Option
中,值None
可以被函数用来返回一个null值。如果有数据要返回,函数可以返回Some(data)
。
通过一个示例来理解:
该程序定义了一个名为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)
匹配语句和枚举
匹配语句可以用来比较保存在枚举中的值。下面的示例定义了一个函数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函数的示例也可以使用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语句的用法。
// The `derive` attribute automatically creates the implementation
// required to make this `enum` printable with `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