Match匹配

有时候,使用if/else会有些繁杂,而Match关键词提供了一个比其他语言中switch & case更加强大的匹配分支选择器。

Match是这么使用的:

let x = 5;
match x {
    1 => println!("one"),
    2 => println!("two"),
    3 => println!("three"),
    4 => println!("four"),
    5 => println!("five"),
    _ => println!("something else"),
}

Match在匹配上,是使用匹配值pattern => 操作这样的分支来进行选择。

Match不会出现C等语言中,Switch匹配时,case条件的向下执行问题,也就是说,match仅匹配成功一次后就退出,不会再向下检查。

同时,匹配的匹配值pattern也需要保持唯一,否则会得到一个编译错误。

另外,我们需要关注最后一个pattern _,这是一个类似switch中的defualt条件,所有与其他条件不匹配的情况,都会被它匹配。在Match的条件上使用的不是enum这种固定的枚举值的时候,忽略_是会得到一个编译错误的。

下面是个使用enum枚举值匹配的例子:

use std::cmp::Ordering;

fn cmp(a: i32, b: i32) -> Ordering {
    if a < b { Ordering::Less }
    else if a > b { Ordering::Greater }
    else { Ordering::Equal }
}

fn main() {
    let x = 5;
    let y = 10;

    match cmp(x, y) {
        Ordering::Less => println!("less"),
        Ordering::Greater => println!("greater"),
        Ordering::Equal => println!("equal"),
    }
}

这里,我们首次看到了 use 关键字,这是Rust里的包管理关键字,暂时你就知道它会导入std\cmp包中的Ordering类型即可,在后面的章节我们专门会讲到use的用法。

同时,match结果和函数返回值一样,可以被直接let赋值或当作变量使用,类似下面的例子:

use std::cmp::Ordering;

fn cmp(a: i32, b: i32) -> Ordering {
    if a < b { Ordering::Less }
    else if a > b { Ordering::Greater }
    else { Ordering::Equal }
}

fn main() {
    let x = 5;
    let y = 10;

    println!("{}", match cmp(x, y) {
        Ordering::Less => "less",
        Ordering::Greater => "greater",
        Ordering::Equal => "equal",
    });
}