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_valueNone,这个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}"),
}
  • 打赏
  • 分享
分享到...
请选择打赏方式
  • 微信
  • 支付宝

By yhl

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注