12_rust的match、if let
match
强大的控制流运算符。
- 允许一个值和一系列模式进行匹配,并执行匹配的模式对于的代码
- 模式可为字面值、变量名、通配符...
比如下边例子用于匹配返回具体值
enum Color {
Black,
White,
Red,
}
fn value_Color(color: Color) -> u32 {
match color { // 匹配枚举,从第一行开始逐行匹配,匹配到后已箭头后的返回值作为match的返回值
Color::Black => { // 多行语句可加{}后+一返回值
println!("black");
0x0;
},
Color::White => 0xffffff, // 单行可直接返回数值
Color::Red => 0xff0000,
}
}
fn main() {}
绑定值的模式
匹配的分支可绑定到被匹配对象的部分值,因此,可从enum变体中提取值。
#[derive(Debug)]
enum WeekDay {
MOD,
TUS,
WED,
}
enum Timekeep {
Hour,
Day,
Week(WeekDay), // 让其关联一数据,是一枚举
}
fn value_in_timekeep(t: Timekeep) -> u8 {
match t {
Timekeep::Hour => 0,
Timekeep::Day => 1,
Timekeep::Week(w) => { // 因为变体里能存值,所以用w变量绑定到所存的值里,这就是绑定值的模式
println("weekday {:?}", w);
2
}
}
}
fn main() {
let w = Timekeep::Week(WeekDay::MOD);
println("{}", value_in_timekeep(w));
}
匹配Option<T>
就是匹配option的some和None。
fn main() {
let five = Some(5);
let six = add_one(five);
let none = add_one(None);
}
fn add_one(x: Option<i32>) -> Option<i32> {
match x {
None => None,
Some(i) => Some(i + 1),
}
}
match匹配时必须穷举所有的可能
就是enum里定义了几个,就要全部穷举出来,不然会报non-exhaustive patterns:xxxx not covered的错误,意思是确实xxx匹配。
如果enum的成员数量太多,只想匹配部分,则可使用 “_通配符” 替代其余没有列出来的值。
fn main() {
let v = 0u8;
match v { // 枚举u8所有的可能值,但有256种,仅想处理其中几个
1 => println!("one"),
2 => println!("two"),
3 => println!("three"),
_ => (), // 其余的走这个匹配,通配符要放最好,返回值空tuple,即什么都不做。
}
}
if let
if let是match的特殊形式语法糖,处理只关心一种匹配而忽略其他匹配的情况。
整体更简单,无需穷举其他,也可搭配else处理其他情况。
fn main() {
let v = Some(0u8);
match v { // 比如只要处理一种情况,match语法如下
Some(1) => println!("one"),
_ => (), // 其余的走这个匹配,通配符要放最好,返回值空tuple,即什么都不做。
}
if let Some(1) = v { // 表示只处理值为1的情况,其他情况不处理,效果和上面match 一样
println("one");
} else { // 其他情况
println!("others")
}
}