match.md
commit fc4bb5f77060b5822f25edbabbdf7a1d48a7f8fe
一个简单的[if
](If If语句.md)/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
是它的一个实现。有[一个整个关于模式的部分](Patterns 模式.md)讲到了所有可能的模式。
那么这有什么巨大的优势呢?这确实有优势。第一,match
强制穷尽性检查(exhaustiveness checking)。你看到了最后那个下划线开头的分支了吗?如果去掉它,Rust 将会给我们一个错误:
error: non-exhaustive patterns: `_` not covered
Rust 试图告诉我们忘记了一个值。编译器从x
推断它可以是任何正的 32 位整型值;例如从 1 到 2,147,483,647。_
就像一个匹配所有的分支,它会捕获所有没有被match
分支捕获的所有可能值。如你所见,在上个例子中,我们提供了 1 到 5 的mtach
分支,如果x
是 6 或者其他值,那么它会被_
捕获。
match
也是一个表达式,也就是说它可以用在let
绑定的右侧或者其它直接用到表达式的地方:
let x = 5;
let number = match x {
1 => "one",
2 => "two",
3 => "three",
4 => "four",
5 => "five",
_ => "something else",
};
有时,这是一个把一种类型的数据转换为另一个类型的好方法。
匹配枚举(Matching on enums)
match
的另一个重要的作用是处理枚举的可能变量: