|
|
|
@ -44,6 +44,7 @@ match target {
|
|
|
|
|
},
|
|
|
|
|
_ => 表达式3
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
该形式清晰的说明了何为模式,何为模式匹配:将模式与`target`进行匹配,即为模式匹配,而模式匹配不仅仅局限于`match`,后面我们会详细阐述。
|
|
|
|
|
|
|
|
|
@ -117,7 +118,7 @@ enum Coin {
|
|
|
|
|
Quarter(UsState), // 25美分硬币
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
其中Coin::Quarter成员还存放了一个值:美国的某个州,因为在1999年到2008年间,美国在25美分(Quater)硬币的背后为50个州印刷了不同的设计, 其它硬币都没有相关的设计。
|
|
|
|
|
其中`Coin::Quarter`成员还存放了一个值:美国的某个州,因为在1999年到2008年间,美国在25美分(Quarter)硬币的背后为50个州印刷了不同的设计, 其它硬币都没有相关的设计。
|
|
|
|
|
|
|
|
|
|
接下来,我们希望在模式匹配中,获取到25美分硬币上刻印的州的名称:
|
|
|
|
|
```rust
|
|
|
|
@ -283,7 +284,7 @@ fn main() {
|
|
|
|
|
|
|
|
|
|
现在如果想对`v`进行过滤,只保留类型是`MyEnum::Foo`的元素,你可能想这么写:
|
|
|
|
|
```rust
|
|
|
|
|
v.iter().filter(|x| x == MyEnum:::Foo);
|
|
|
|
|
v.iter().filter(|x| x == MyEnum::Foo);
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
但是,实际上这行代码会保存,因为你无法将`x`跟一个类型进行比较。好在,你可以使用`match`来完成,但是会导致代码更为啰嗦,是否有更简洁的方式?答案是使用`matches!`:
|
|
|
|
@ -301,7 +302,7 @@ assert!(matches!(bar, Some(x) if x > 2));
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 变量覆盖
|
|
|
|
|
无论是是`match`还是`if let`,他们都可以在模式匹配时覆盖掉老的值,绑定新的直:
|
|
|
|
|
无论是是`match`还是`if let`,他们都可以在模式匹配时覆盖掉老的值,绑定新的值:
|
|
|
|
|
```rust
|
|
|
|
|
fn main() {
|
|
|
|
|
let age = Some(30);
|
|
|
|
|