match控制流运算符
enum Coin {Penny,Nickel,Dime,Quarter,}fn value_in_cents(coin: Coin) -> u8 {match coin {Coin::Penny => {println!("Lucky penny!");1},Coin::Nickel => 5,Coin::Dime => 10,Coin::Quarter => 25,}}
绑定值的模式
可以绑定匹配模式的部分值。即从枚举成员中提取植。
#[derive(Debug)] // 这样可以立刻看到州的名称enum UsState {Alabama,Alaska,// --snip--}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},}}
匹配Option
fn plus_one(x: Option<i32>) -> Option<i32> {match x {None => None,Some(i) => Some(i + 1),}}let five = Some(5);let six = plus_one(five);let none = plus_one(None);
匹配Some
匹配是穷尽的
Rust 知道我们没有覆盖所有可能的情况甚至知道哪些模式被忘记了!Rust 中的匹配是穷尽的(exhaustive):必须穷举到最后的可能性来使代码有效。
通配模式和_占位符
必须将通配分支放在最后。
let dice_roll = 9;match dice_roll {3 => add_fancy_hat(),7 => remove_fancy_hat(),other => move_player(other),}fn add_fancy_hat() {}fn remove_fancy_hat() {}fn move_player(num_spaces: u8) {}
当我们不想使用通配模式获取值的时候,可以使用”_”,匹配任意值而不绑定到该值。
let dice_roll = 9;match dice_roll {3 => add_fancy_hat(),7 => remove_fancy_hat(),_ => reroll(),}fn add_fancy_hat() {}fn remove_fancy_hat() {}fn reroll() {}
if let简洁控制流
用来处理只匹配一个模式的值而忽略其他模式的情况。
let some_u8_value = Some(0u8);match some_u8_value {Some(3) => println!("three"),_ => (),}if let Some(3) = some_u8_value {println!("three");}
let mut count = 0;match coin {Coin::Quarter(state) => println!("State quarter from {:?}!", state),_ => count += 1,}
let mut count = 0;if let Coin::Quarter(state) = coin {println!("State quarter from {:?}!", state);} else {count += 1;}
