Rust 模式

发布时间: 更新时间: 总字数:795 阅读时间:2m 作者: IP上海 分享 网址

模式是Rust中的特殊语法,用于匹配复杂和简单类型的结构

介绍

使用场景:将模式与匹配表达式和其他构造结合使用,能更好的控制程序的控制流

模式由以下元素或组合组成:

  • 字面值
  • 变量
  • 通配符
  • 占位符
  • 解构的数据、enum、struct和tuple,以 struct 为例
struct Point {
    x: i32,
    y: i32,
}

fn abc() {
    let p = Point{ x: 0, y: 7};
    let Point { x: a, y: b} = p; // let Point{ x, y } = p;
    assert_eq!(0, a);
    assert_eq!(7, b);

    match p {
        Point { x, y: 0} => ...,
    }
}

辩驳性

模式由两种形式:

  • 可辩驳模式:对于某些值,无法进行匹配的模式,如 if let Some(x) = a_value { } 如果 a_value = None
  • 无可辩驳模式:能匹配任何可能传递的值的模式,如 let x = 5;

使用场景:

  • 函数参数、let语句、for循环只接受 无可辩驳的模式
  • if let 和 while let 可接受 可辩驳无可辩驳 的模式

match 的 arm

match value {
    Pattern1 => Expression1,
    Pattern2 => Expression2,
    Pattern3 | Pattern4 => Expression3,  // 匹配 Pattern3 or Pattern4
    1..5 => Expression4,  // 匹配 1,2,3,4
    _ => (),
}

说明:

  • match 表达式要求详尽可能性

  • _(下划线)是特殊的模式,会匹配任何东西,但不会绑定到变量,通常是最后一个arm,用于忽略某些值

    • _ 可以在函数定义中,用来忽略接收变量
    • 嵌套的 _ 忽略值的一部分,如 Some(_)
    • 使用 _ 开头命名,忽略未使用的变量,类似于 Python
    • 使用 .. 忽略值的剩余部分,如 Point { x, ..}
  • match 守卫:match arm 模式后额外的 if 条件,适合更复杂的场景

let num = Some(8);
match num {
    Some(x) if x < 6 => ...,
}

条件 if let 表达式

  • if let 表达式主要是作为一种简短的方式来等价的代替只有一个匹配项的 match,但不会检查穷尽性
  • if let 可选的可以是
    • else if
    • else if let

while let 条件循环

只要模式继续满足匹配的条件,那么 while 循环一直运行

let mut stack = Vec::new();
stack.push(1);
stack.push(2);
while let Some(i) = stack.pop(){
    println!("{}", i); // 2 1
}

for 循环

for 循环中,模式就是 for 关键字后的值

let mut a = vec!['a', 'b', 'c'];

for (i, v) in a.iter().enumerate() {
    println!("{} {}", i, v);
}

let 语句

let 语句也是模式

let Pattern1 = Expression1;

let a = 8;
let (x, y, z) = (1, 2, 3);

函数的参数

函数的参数也是模式

fn foo(x: i32) {
    // some code
}

@绑定

@绑定 符合可以创建一个变量,该变量可以在测试某个值是否与模式匹配的同时保存该值

enum Message {
    Hello { id: i32 },
}

fn main() {
    let msg = Message::Hello{ id: 5};
    match msg {
        Message::Hello {
            id: id_var @ 3..=7,
        } => {
            ...
        }
        Message::Hello {
            id: 1..=2,
        } => {
            ...
        }
        Message::Hello { id } => {
            ...
        }
        _ => ()
    }
}
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数