6 枚举和模式匹配
枚举允许你通过列举可能的成员来定义一个类型。在本章,我们会了解枚举如何连同数据一起编码信息,还会学习一个特殊的枚举Option,另外,我们也会进一步了解match表达式中的模式匹配,针对不同的枚举值编写相应的代码,最后我们将会介绍if let (它是一个结构,能够方便处理代码中的枚举)
枚举是很多语言中都有的一个功能,不同语言功能各不相同。Rust中的枚举与F#、OCaml、和Haskell这样的函数式编程语言中的代数数据类型最为相似
6.3 if let 简洁控制流
当我们只想匹配一个模式时,if let 能够让我们以非常简洁的语法实现它。先让我们来看一个老例子,它是用match控制流运算符实现的
let some_u8_value = Some(0u8);
match some_u8_value {
Some(3) => println!("three"),
_ => (),
}
用match的时候就按部就班,虽然我们已经使用了 _ 通配符对我们不需要的分支进行处理,这样代码量已经很少了,但是其实跟if let相比,还是挺多的,那我们来用if let 对上述实现进行改写
if let Some(3) = some_u8_value {
println!("three");
}
是不是代码量少了很多?很强,有没有?其实,if let是match 的一个语法糖,它只会匹配列出来的分支而忽略其它可能。但是我们也可以在if let 中包含一个else,它在功能上其实相当于 _ 通配符,我们来看两个例子:
let mut count = 0;
match coin {
Coin::Quarter(state) => println!("State quarter from {:?}!",state),
_ => count +=1,
}
let mut count = 0;
if let Coin::Quarter(state) = coin {
println!("State quarter from {:?}!",state);
}else {
count += 1;
}
所以关于if let 的内容就这么多了,我们可以把它与match联系到一起来理解学习
小结
我们现在已经了解了用结构体、枚举创建一系列可以列举值的自定义类型。我们也了解了标准库的Option类型如何帮助你利用类型系统来避免出错。对于枚举成员的处理,我们又了解了match和if let
下一章我们将会学习Rust的模块系统