📅  最后修改于: 2020-11-02 04:18:49             🧑  作者: Mango
在Rust编程中,当我们必须从可能的变体列表中选择一个值时,我们使用枚举数据类型。使用enum关键字声明枚举类型。以下是enum的语法-
enum enum_name {
variant1,
variant2,
variant3
}
该示例声明一个枚举-GenderCategory ,其变体形式为Male和Female。打印!宏显示枚举的值。编译器将针对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
下面的示例定义一个结构Person。字段性别类型为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 ,并初始化每个对象的属性,名称和性别。
Person { name: "Mohtashim", gender: Male }
Person { name: "Amy", gender: Female }
选项是Rust标准库中的预定义枚举。这个枚举有两个值-Some(data)和None。
enum Option {
Some(T), //used to return a value
None // used to return null, as Rust doesn't support
the null keyword
}
在此,类型T表示任何类型的值。
Rust不支持null关键字。 enumOption中的值None可以被函数以返回空值。如果有要返回的数据,则该函数可以返回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 {
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 {
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