match控制流运算符

  1. enum Coin {
  2. Penny,
  3. Nickel,
  4. Dime,
  5. Quarter,
  6. }
  7. fn value_in_cents(coin: Coin) -> u8 {
  8. match coin {
  9. Coin::Penny => {
  10. println!("Lucky penny!");
  11. 1
  12. },
  13. Coin::Nickel => 5,
  14. Coin::Dime => 10,
  15. Coin::Quarter => 25,
  16. }
  17. }

绑定值的模式

可以绑定匹配模式的部分值。即从枚举成员中提取植。

  1. #[derive(Debug)] // 这样可以立刻看到州的名称
  2. enum UsState {
  3. Alabama,
  4. Alaska,
  5. // --snip--
  6. }
  7. enum Coin {
  8. Penny,
  9. Nickel,
  10. Dime,
  11. Quarter(UsState),
  12. }
  13. fn value_in_cents(coin: Coin) -> u8 {
  14. match coin {
  15. Coin::Penny => 1,
  16. Coin::Nickel => 5,
  17. Coin::Dime => 10,
  18. Coin::Quarter(state) => {
  19. println!("State quarter from {:?}!", state);
  20. 25
  21. },
  22. }
  23. }

匹配Option

  1. fn plus_one(x: Option<i32>) -> Option<i32> {
  2. match x {
  3. None => None,
  4. Some(i) => Some(i + 1),
  5. }
  6. }
  7. let five = Some(5);
  8. let six = plus_one(five);
  9. let none = plus_one(None);

匹配Some

匹配是穷尽的

Rust 知道我们没有覆盖所有可能的情况甚至知道哪些模式被忘记了!Rust 中的匹配是穷尽的(exhaustive):必须穷举到最后的可能性来使代码有效。

通配模式和_占位符

必须将通配分支放在最后。

  1. let dice_roll = 9;
  2. match dice_roll {
  3. 3 => add_fancy_hat(),
  4. 7 => remove_fancy_hat(),
  5. other => move_player(other),
  6. }
  7. fn add_fancy_hat() {}
  8. fn remove_fancy_hat() {}
  9. fn move_player(num_spaces: u8) {}

当我们不想使用通配模式获取值的时候,可以使用”_”,匹配任意值而不绑定到该值。

  1. let dice_roll = 9;
  2. match dice_roll {
  3. 3 => add_fancy_hat(),
  4. 7 => remove_fancy_hat(),
  5. _ => reroll(),
  6. }
  7. fn add_fancy_hat() {}
  8. fn remove_fancy_hat() {}
  9. fn reroll() {}

if let简洁控制流

用来处理只匹配一个模式的值而忽略其他模式的情况。

  1. let some_u8_value = Some(0u8);
  2. match some_u8_value {
  3. Some(3) => println!("three"),
  4. _ => (),
  5. }
  6. if let Some(3) = some_u8_value {
  7. println!("three");
  8. }
  1. let mut count = 0;
  2. match coin {
  3. Coin::Quarter(state) => println!("State quarter from {:?}!", state),
  4. _ => count += 1,
  5. }
  1. let mut count = 0;
  2. if let Coin::Quarter(state) = coin {
  3. println!("State quarter from {:?}!", state);
  4. } else {
  5. count += 1;
  6. }