Rust 学习笔记-14 枚举

在Rust编程中,当我们必须从可能的列表值中选择一个值时,我们使用枚举数据类型。 使用enum关键字声明枚举类型。
以下是enum的语法:
enum enum_name { variant1, variant2, variant3}
使用枚举
该示例声明一个枚举- GenderCategory,其变体形式为Male和Female。 print! 宏显示枚举的值。 编译器将针对GenderCategory 未实现特征std :: fmt :: Debug 引发错误。
属性#[derive(Debug)] 用于抑制此错误。
// `derive` 属性 自动创建fmt::Debug实现.// 好让这个枚举可以打印出来#[derive(Debug)]enum GenderCategory { Male,Female}fn demo58() { let male = GenderCategory::Male; let female = GenderCategory::Female; println!("{:?}",male); println!("{:?}",female);}fn main() { demo58();}
输出结果:
MaleFemale
结构体和枚举
看下面这个例子,定义一个结构体Person。 字段性别类型为 GenderCategory(它是一个枚举),可以将其分配为Male或Female作为值。
#[derive(Debug)]struct Person { name: String, gender: GenderCategory,}fn demo59() { let p1 = Person { name: String::from("向天问"), gender: GenderCategory::Male, }; let p2 = Person { name: String::from("雷顶天"), gender: GenderCategory::Female, }; println!("{:?}", p1); println!("{:?}", p2);}fn main() { demo59();}
输出结果:
Person { name: "向天问", gender: Male }Person { name: "雷顶天", gender: Female }
Option 枚举
option 是Rust标准库中的预定义枚举。 这个枚举有两个值-Some(data)和None。
语法定义:
enum Option { Some(T), // 用户返回值. None // 用户返回空值. 类似null.}
这里,类型T表示任何类型的值。
Rust不支持null关键字。 enum Option中的值None可以由函数使用以返回空值。 如果有要返回的数据,则该函数可以返回Some(data)。
看下面这个示例:
fn is_even(no:i32)->Option { if no%2 == 0 { Some(true) } else { None }}fn demo60() { let result = is_even(3); println!("{:?}",result); println!("{:?}",is_even(30));}fn main() { demo60();}
输出:
NoneSome(true)
该程序定义一个函数is_even(),其返回类型为Option。 该函数验证传递的值是否为偶数。 如果输入为偶数,则返回值true,否则函数返回None。
rust 没有null, 通过这种方法可以实现返回2个情况的值. 而不限定只能是某种类型, 一个用来返回是正确的值,另外一种返回空值. 为后续的判断做了明确的区分.
匹配(Match)语句和枚举
match语句可用于比较枚举中存储的值。
下面的示例定义一个函数 print_size,该函数将CarType枚举作为参数。 该功能将参数值与一组预定义的常数进行比较,并显示相应的消息.
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 demo61(){ print_size(CarType::SUV); print_size(CarType::Hatch); print_size(CarType::Sedan);}fn main() { demo61();}
cargo run:
Large sized Sports Utility carSmall sized carmedium sized car
Match 和 Option
返回选项类型的is_even函数示例也可以使用match语句实现,
如下例子:
fn demo62() { match is_even(5) { Some(data) => { if data == true { println!("Even no"); } } None => { println!("not even"); } }}fn main() { demo62();}
cargo run 输出结果:
not even
匹配语句与带数据类型的枚举
可以将数据类型添加到枚举的每个变体(variant) 里面。
在下面的示例中,枚举的Name和Usr_ID变体分别为String和integer类型。 下面的示例说明将match语句与具有数据类型的枚举一起使用。
#[derive(Debug)]enum GenderCategory2 { Name(String),Usr_ID(i32)}fn demo63() { let p1 = GenderCategory::Name(String::from("张无忌")); let p2 = GenderCategory::Usr_ID(100); println!("{:?}",p1); println!("{:?}",p2); match p1 { GenderCategory::Name(val)=> { println!("{}",val); } GenderCategory::Usr_ID(val)=> { println!("{}",val); } }}fn main() { demo63();}
输出结果:
fn demo63() { let p1 = GenderCategory2::Name(String::from("张无忌")); let p2 = GenderCategory2::Usr_ID(100); println!("{:?}",p1); println!("{:?}",p2); match p1 { GenderCategory2::Name(val)=> { println!("{}",val); } GenderCategory2::Usr_ID(val)=> { println!("{}",val); } }}fn main() { demo63();}
也就是说枚举可以支持不同数据类型的变量放同一个枚举内。


往期回顾:
Rust学习笔记-1 Rust 介绍. Rust 学习笔记-2 环境安装 Rust学习笔记-2.1 rustup 镜像加速,飞起 Rust 学习笔记-3 Hello World Rust学习笔记-4 Rust 基础数据类型 Rust 学习笔记-5 变量与常量 Rust 学习笔记-6 有趣的字符串 Rust 学习笔记-7 可爱的操作符 Rust 学习笔记-8 条件语句与循环 Rust 学习笔记-9 函数 Rust 学习笔记-10 所有权(Rust内存安全的核心) Rust学习笔记-11 移动(转移)和借用 Rust 学习笔记-12 切片还是切丝任你选 Rust 学习笔记-13 Rust 结构体