当前位置: 首页 > 工具软件 > Match > 使用案例 >

Rust:Match语句详解

齐建白
2023-12-01

基本语法:

Match这个词本身十分直观的描述了match语句的功能,也就是将value与pattern match起来,然后执行对应的表达式,基本语法如下所示
match VALUE {
    PATTERN => EXPRESSION,
    PATTERN => EXPRESSION,
    PATTERN => EXPRESSION,
}

Rust 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

 类似资料: