基本语法:
Match客户管理系统开发定制这个词本身十分直观的描述了match客户管理系统开发定制语句的功能,也就是将value与pattern match起来,然后执行对应的表达式,基本语法如下所示
- match VALUE {
- PATTERN => EXPRESSION,
- PATTERN => EXPRESSION,
- PATTERN => EXPRESSION,
- }
book里一个简单的例子:
- enum Coin {
- Penny,
- Nickel,
- Dime,
- Quarter,
- }
-
- fn value_in_cents(coin: Coin) -> u8 {
- match coin {
- Coin::Penny => 1,
- Coin::Nickel => 5,
- Coin::Dime => 10,
- Coin::Quarter => 25,
- }
- }
当你在 => 后执行的语句不止一条时,需要加 {}:
- fn value_in_cents(coin: Coin) -> u8 {
- match coin {
- Coin::Penny => {
- println!("Lucky penny!");
- 1
- },
- Coin::Nickel => 5,
- Coin::Dime => 10,
- Coin::Quarter => 25,
- }
- }
Match成功之后,对应的表达式可以使用用于匹配的value。
比如我们写一个enum Number,里面的两种类型时NumI8,NumU8,类型分别为i8,u8。创建num,类型为Number::NumI8。match语句里,num是我们将要进行匹配的value。由于Enum Number里的NumI8/U8是带参数的,所以match语句里的Number::NumI8也需要提供参数。例子里写的是_num。匹配成功后,_num会接受num的值,并可以在后面的表达式里使用。
- enum Number{
- NumI8(i8),
- NumU8(u8),
- }
-
- fn main(){
- let num = Number::NumI8(-5);
- match num {
- Number::NumI8(_num) => println!("{}",_num),
- Number::NumU8(_num) => println!("1"),
- }
- }
-5
Match语句的exhaustive(穷尽)特性:
match语句存在一个exhaustive特性,我觉得可以翻译为“穷尽”。也就是说match语句要求穷尽value的所有pattern。
- fn plus_one(x: Option<i32>) -> Option<i32> {
- match x {
- Some(i) => Some(i + 1),
- }
- }
- error[E0004]: non-exhaustive patterns: `None` not covered
- -->
- |
- | match x {
- | ^ pattern `None` not covered
当你不想穷尽所有可能的pattern的时候,Rust也提供了相应的解决办法:_ placeholder
比如 u8 的范围为0~255,我们可能只关心其中几个“pattern” :1,3,5,7。这时候可以用_ placeholder代替其他所有pattern
- let some_u8_value = 0u8;
- match some_u8_value {
- 1 => println!("one"),
- 3 => println!("three"),
- 5 => println!("five"),
- 7 => println!("seven"),
- _ => (),
- }
当你只想匹配一种pattern时,Rust提供了一种语法糖:If let语句
比如:
- let some_u8_value = Some(0u8); //0u8的意思是一个u8类型的0
- match some_u8_value {
- Some(3) => println!("three"),
- _ => (),
- }
改写为:
- if let Some(3) = some_u8_value {
- println!("three");
- }
if let语句相比完整版要更简洁,但要注意的是:使用if let语句也就丧失了match语句的“穷尽”特性。
if let 与if语句的区别:
if let执行后续表达式(也就是上述例子中的:println!("three"); )的条件是match,而if执行后续表达式的条件是 true