1 枚举
枚举是一种自定义数据类型,包含一些确定的值。 它在枚举名称之前使用enum
关键字定义。
enum 枚举名 {
枚举值,
...
}
// 样例
enum IpAddrKind {
V4,
V6,
}
1.1 枚举值
# [derive(Debug)]
enum WeekDay {
MON,
TUE,
WED,
THU,
FRI,
SAT,
SUN,
}
// 枚举实例
let week_days = WeekDay::FRI;
let week2 = WeekDay::MON;
1.2 枚举作为函数参数
// 枚举类型作为函数参数
fn print_weekday(week : &WeekDay) {
println!("today is {:?}", week)
}
// 函数调用
print_weekday(&week_days);
1.3 枚举成员绑定不同的数据类型
枚举值绑定不同的类型,使用枚举并将数据直接放进每一个枚举成员。c++语言没有这种用法。
enum WeekDay {
MON(u32),
TUE(String),
WED(i32),
THU(String),
FRI,
SAT,
SUN,
}
let week_days = WeekDay::THU(String::from("星期二"));
let week1 = WeekDay::MON(1);
let week3 = WeekDay::WED(3);
如上 WeekDay
枚举类型中一些枚举成员放入一些数据。
2 模式匹配
2.1 match匹配
对于上述枚举成员绑定的数据如何取出来呢?这时候就用到了匹配。匹配是需要穷举的,有时候我们不需要匹配所有模式这时候可以用到通配模式
和_占位符
。
match week {
WeekDay::MON(val) => println!("today is {}", val), // val = 1
WeekDay::TUE(val) => println!("today is {}", val), // val = "星期二"
WeekDay::WED(val) => println!("today is {}", val), // val = 3
// other => println!("other deal ... {:?}", other), // 通配模式
_ => println!("other do not deal ..."),
}
由于 match需要穷举所有的枚举类型,但有时候我们不想一一列出,对于不关心的,有两种处理方式。
通配模式: 使用 other
表示,表示剩下的类型都直接给other变量,可以统一处理。
_占位符: 表示不用关心匹配的类型
2.2 if let简洁匹配
if let
语法让我们以一种不那么冗长的方式结合 if
和 let
,来处理只匹配一个模式的值而忽略其他模式的情况。 if let
可以看作是 match
的语法糖。
let week_days = WeekDay::THU(String::from("星期二"));
if let WeekDay::THU(str) = week_days {
println!(" {}", str);
}