18.1 哪里可以使用模式
在rust
中,模式到处都是
let x = 3
就是一个模式,所以可以写 let (x, y) = (3, 4)
。这是一个模式。
常见的模式场景有:
18.1.1 match
match x{
Some(i) => Some(i+1),
None => None,
}
18.1.2 if let
if let Some(i) = x {
Some(i + 1)
} else {
None
}
使用if let
可以匹配一些复杂场景,可以混用多种 if let
。
if let Some(i) = x {
} else if let Some(j) = y {
} else {
}
18.1.3 while let
除了if let
,还有 while let
,用法相同。
18.1.4 for 循环
for
循环也可以使用模式。
for (i, j ) in xx {
}
18.1.5 let语句
一开始说的 let
语句是最常用的匹配。
18.1.6 函数参数
函数传参也是模式的一种。
18.2 可拒绝模式和不可拒绝模式
如果一个模式是可被拒绝的,意味着这个模式通常属于分支,可能成立也可能不成立,而不可拒绝的模式意味着必须匹配的情况。我们说的匹配,都是针对可拒绝模式的。
不可拒绝模式最精典的是 let
。
let Some(x) = option_value;
如果 option_value
是None
,这个let
就没办法成立了。所以这是不可拒绝的模式。
18.3 模式匹配的一些情形,这里有一些有意义的方式
18.3.1 匹配值
最简单的最经典的就是匹配值:
let x = 1;
match x {
1 => println!("one");
2 => println!("two");
_ => println!("else");
}
18.3.2 匹配变量
更进一步的就是匹配变量
let x = Some(50);
match x {
Some(50) => println!("Got 50");
Some(y) => println!("Got y = {y}");
_ => println!("None");
}
18.3.3 多模式匹配
除了上面单个匹配的,有时还需要匹配多个值,用|
隔离。
let x = 1;
match x {
1 | 2 | 3 => println!("one two three"),
_ => println!("else"),
}
18.3.4 匹配范围
有时,单用数量并不能确定匹配,需要一个范围 。
let x = 1;
match x {
1..=10 => println!("1~10"),
_ => println!("else"),
}
18.3.5 匹配条件, if
更进一步的情况,范围也不能满足,比如我们要筛选能被3整除的数
let x = 1;
match x {
i if i % 3 == 0 => println!("can be divide by 3"),
_ => println!("else"),
}
18.3.6 匹配结构
可以匹配结构,
struct Point{
x: i32,
y: i32,
}
let pt = Point{x: 10, y: 10};
let Point{x: a, y: b} = pt;
match pt {
Point {x, y:0} => println!("y is zero"),
Point {x: 0, y} => println!("x is zero"),
Point {x, y} => println!("x, y = {x}, {y}"),
}
18.3.7 匹配枚举
同样的方式可以匹配枚举,如之前匹配 Some
。
let x = Some(Point{10, 10});
match x {
Some(Point{x, y}) => ...,
_ => ...,
}
18.3.8 匹配值的变量名
按之前说的,要不匹配变量名,要不匹配一个条件,有时,即想有变量名,又想有条件怎么办?使用@
。
struct Point{
x: i32,
y: i32,
}
let pt = Point{x: 10, y: 10};
match pt {
Point {x, y: y_value @ 0..=10 } => println!("y is {y_value}"),
Point {x: 0, y} => println!("x is zero"),
Point {x, y} => println!("x, y = {x}, {y}"),
}
- 打赏
- 分享
分享到...
请选择打赏方式
- 微信
- 支付宝