match 是针对 enum 类型进行判断的语法,关键字后面的表达式表示的是 值 , 下面的分支被称为 arm , arm 由 pattern 和 code 组成,pattern 中可以声明变量来接收 enum 类型内部的值,code 如果是 expression 则有可能被作为函数的返回值. 同时other
或是_
被用作表示匹配所有值的占位符
1 2 3 4 5 6 7 8 9 10
| let dice_roll = 9; match dice_roll { 3 => add_fancy_hat(), 7 => remove_fancy_hat(), _ => (), }
fn add_fancy_hat() {} fn remove_fancy_hat() {}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #[derive(Debug)] enum UsState { Alabama, Alaska, }
enum Coin { Penny, Nickel, Dime, Quarter(UsState), }
fn value_in_cents(coin: Coin) -> u8 { match coin { Coin::Penny => 1, Coin::Nickel => 5, Coin::Dime => 10, Coin::Quarter(state) => { println!("State quarter from {:?}!", state); 25 } } }
|
另一种表示 enum 类型处理的方式是if let
这种方式更自由,并且不需要遍历枚举值的所有可能性,这会在很多时候方便一些。
例如针对上面的哪个 Coin 类型,可以用 if let 处理如下:
1 2 3 4 5 6 7
| let mut count = 0; if let Coin::Quarter(state) = coin { println!("State quarter from {:?}!", state); } else { count += 1; }
|