0
点赞
收藏
分享

微信扫一扫

Windows 10电脑无声问题的全面解决方案

英乐 2024-12-03 阅读 18

Rust学习笔记_07——枚举和范围
Rust学习笔记_08——String
Rust学习笔记_09——模式匹配

守卫

文章目录


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通常更加简洁和直观。
举报

相关推荐

0 条评论