5.14.匹配

一个简单的if/else往往是不够的,因为你可能有两个或更多个选项。这样else也会变得异常复杂,所以我们该如何解决?

Rust有一个match关键字,它可以让你有效的取代复杂的if/else组。看看下面的代码:

let x = 5;

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

match使用一个表达式然后基于它的值分支。每个分支都是val => expression这种形式。当匹配到一个分支,它的表达式将被执行。match属于“模式匹配”的范畴,match是它的一个实现。

那么这有什么巨大的优势呢?这确实有优势。第一,match强制穷尽性检查exhaustiveness checking)。你看到了最后那个下划线开头的分支了吗?如果去掉它,Rust将会给我们一个错误:

error: non-exhaustive patterns: `_` not covered

换句话说,Rust试图告诉我们,我们忘记了一个值。因为x是一个整形,Rsut知道它有很多不同的值,比如,6。如果没有_分支,那么这就没有分支可以匹配了,Rust就会拒绝编译。_就像一个_匹配所有的分支。如果其它的分支都没有匹配上,就会选择`分支,并且因为我们匹配所有的分支,我们现在就有了一个可以表示x`所有可能的值的分支了,这样我们的程序就能顺利编译了。

match也是一个表达式,也就是说它可以用在let绑定的右侧或者其它直接用到表达式的地方:

let x = 5;

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

有时,这是一个把一个类型的数据转换为另一个类型的好方法。

文章导航