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",
});
}