Rust进阶(12)-模式

模式

1. 概述

  1. 模式是Rust中特殊的语法,模式用来匹配值的结构
  2. 模式在使用它的地方并不都是相同的,模式存在不可反驳的和可反驳的
    1. refutable(可反驳)和irrefutable(不可反驳)。能匹配任何传递的可能值的模式被称为是不可反驳的。对值进行匹配可能会失败的模式被称为可反驳的
    2. 只能接受不可反驳模式的有:函数、let语句、for循环。原因:因为通过不匹配的值程序无法进行有意义的工作
    3. if let和while let表达式被限制为只能接受可反驳的模式,因为它们的定义就是为了处理有可能失败的条件
  3. 模式由如下内容组成:
    1. 字面值
    2. 解构的数组、枚举、结构体或者元组
    3. 变量
    4. 通配符
    5. 占位符

2. 基本使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
fn main() {
//1. match
//必须匹配完所有情况
let a = 1;
match a {
0 => println!("Zero"),
1 => println!("One"),
_ => println!("other"),
}
//2. if let
let color: Option<&str> = None;
let is_ok = true;
let age: Result<u8, _> = "33".parse();
if let Some(c) = color {
println!("color: {}", c);
} else if is_ok {
println!("is ok");
} else if let Ok(a) = age {
if a > 30 {
println!("oh,mature man");
} else {
println!("oh,young man");
}
} else {
println!("in else");
}

//3. while let
//只要模式匹配就一直执行wihle循环
let mut stack = Vec::new();
stack.push(1);
stack.push(2);
stack.push(3);
while let Some(top) = stack.pop() {
println!("top = {}", top);
}//只要匹配Some(value),就会一直循环

//4. for循环
//在for循环中,模式是直接跟随for关键字的值,例如for x in y,x就是对应的模式
//此处模式是(index, value)
let v = vec!['a', 'b', 'c'];
for (index, value) in v.iter().enumerate() {
println!("index: {}, value: {}", index, value)
}

//5. let
//let PATTERN = EXPRESSION
let (x, y, z) = (1, 2, 3); //(1,2,3)会匹配(x,y,z),将1绑定x,2绑定y,3绑定z
println!("{}, {}, {}", x, y, z);
let (x, .., z) = (1, 2, 3);
println!("{}, {}, {}", x, y, z);

//6. 函数
//函数的参数也是模式
//&(3, 5)匹配模式&(x, y)
let p = (3, 5);
print_point(&p);

}

fn print_point(&(x, y): &(i32, i32)) {
println!("x: {}, y: {}", x, y);
}

3. 模式的不可反驳和可反驳

1
2
3
4
5
6
7
8
9
10
11
fn main() {
//错误
let a: Option<i32> = Some(5); //匹配Some(value),None
let b: Option<i32> = None; //匹配Some(value),None
let Some(x) = a;

//if let Some(v) = a {
if let v = 5{ //不可反驳模式写在可反驳模式中,会有警告,不建议这么写
println!("v {}",v);
}
}

总结

本文编辑完毕

参考

[1] Rust 程序设计语言

  • Copyrights © 2017-2023 Jason
  • Visitors: | Views:

谢谢打赏~

微信