Rust学习笔记_07——枚举和范围
Rust学习笔记_08——String
Rust学习笔记_09——模式匹配
守卫
文章目录
- 守卫
- 1. 介绍
- 2. 基本用法
- 3. 示例
- 4. 复杂用法
- 5. if let
- 5.1 基本用法
- 5.2 示例
- 5.3 守卫与if let的区别与联系
1. 介绍
在Rust中,守卫(guard)是match
表达式中的一个特性,它允许你在模式匹配的过程中附加一个条件。这个条件是一个表达式,它必须返回一个布尔值(bool
),用于进一步细化或约束某个模式何时应该被匹配。守卫通过if
关键字引入,并紧跟在模式之后。
2. 基本用法
match value {
pattern if condition => result,
_ => default_result,
}
// value 是你想要匹配的值。
// pattern 是你要匹配的模式。
// condition 是一个返回布尔值的表达式,用于进一步约束pattern。
// result 是当value匹配pattern且condition为true时要执行的代码块或返回的值。
// _ 是通配符模式,匹配所有其他情况。
// default_result 是当value不匹配任何带有守卫的模式时执行的代码块或返回的值。
3. 示例
let number = 10;
match number {
n if n > 5 => println!("Number is greater than five"),
n if n <= 5 => println!("Number is five or less"),
_ => println!("This should never be printed"), // 这个分支实际上是不会被执行的,因为上面的两个分支已经覆盖了所有可能的情况。
}
number
被匹配了两次,但每次匹配都附带了一个守卫。第一个守卫检查number
是否大于5,如果是,则执行第一个代码块。第二个守卫检查number
是否小于或等于5,如果是,则执行第二个代码块。由于这两个守卫已经覆盖了所有可能的整数情况,因此通配符模式_
对应的代码块实际上是不会被执行的
4. 复杂用法
fn is_even(n: i32) -> bool {
n % 2 == 0
}
let number = 4;
match number {
n if is_even(n) && n > 2 => println!("Number is even and greater than two"),
n if is_even(n) => println!("Number is even"),
_ => println!("Number is odd"),
}
is_even
函数用于检查一个数字是否是偶数。match
表达式使用守卫来进一步细化匹配条件,分别处理偶数且大于2、偶数和奇数的情况。
5. if let
if let
是Rust中的一个语法糖,它允许你在只关心一个特定模式的情况下,避免编写完整的match
表达式。if let
的语法更加简洁,易于阅读。
5.1 基本用法
if let pattern = value {
// 当value匹配pattern时要执行的代码块
} else {
// 可选的else分支,当value不匹配pattern时要执行的代码块
}
// pattern:你要匹配的模式。
// value:你想要匹配的值。
// 代码块:当value匹配pattern时要执行的代码。
// else分支:可选的,当value不匹配pattern时要执行的代码。
5.2 示例
let some_option: Option = Some(42); if let Some(value) = some_option { println!(“Got a value: {}”, value); } else { println!(“No value found”); }
5.3 守卫与if let的区别与联系
- 区别
- 守卫是
match
表达式中的一个特性,用于在模式匹配的过程中附加额外的条件。 if let
是一个独立的语法结构,用于在只关心一个特定模式的情况下简化代码。- 守卫必须返回一个布尔值,而
if let
则通过模式匹配来检查值。
- 守卫是
- 联系
- 守卫和
if let
都允许你在一定条件下执行特定的代码块。 - 在某些情况下,你可以使用
match
表达式和守卫来实现与if let
相同的功能,但if let
通常更加简洁和直观。
- 守卫和