基本语法:
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
版权归原作者 某科学的泡泡茶壶 所有, 如有侵权,请联系我们删除。