Rust 1.7.0 匹配器 match 的简单介绍和使用

使用过正则表达式的人应该都知道 matcher ,通过 matcher 匹配器运算正则表达式,完成一系列的匹配规则。

在Rust 中 没有 switch 语句,matcher 就是 switch 的一个变形,但比其他语言中的 switch 更强大!

一、简单举例说明

简单的 matcher 和 if 语句非常类似,如果是简单的条件判断可以用if语句:

let n = 5;

if n < 0 {
    print!("{} is negative", n);
} else if n > 0 {
    print!("{} is positive", n);
} else {
    print!("{} is zero", n);
}

复杂一些的条件判断,使用 if 语句就有些力不从心了。 match 可以这样:

let x = 5;

match x {
    1 => println!("one"),
    2 => println!("two"),
    3 => println!("three"),
    4 => println!("four"),
    5 => println!("five"),
    _ => println!("something else"),
}

如果 x == 1 ,打印 one
如果 x == 2, 打印 two
如果 x == 3, 打印 three
如果 x == 4, 打印 four
如果 x == 5, 打印 five
如果没有与 x 匹配的值,
则执行 _ 对应的语句,打印 something else。

解释一下上面的代码的match语句,

  • match 是关键字;
  • x 是表达式;(非结构化的文本表达式)
  • match语句内容包含在 {}大括号中;
  • 括号中的每个 => 叫做 match-arm;
  • 大括号中可以包括任意多个 match-arm;
  • 当 x 存在可能不匹配的情况时,大括号中必须包含 _ => 来覆盖任何不匹配的情况下执行的语句,就像 switch 中的 default 一样。

match语句中 x 表达式的值,要与{}大括号中的每个match-arm分支进行匹配。如果匹配,则执行匹配 match-arm 中 =>后面的语句。

match本身也是个表达式,Rust就是基于表达式的语言。表达式是可以作为右值使用的。

所谓右值,就是看一个表达式能否放到等号的=等号右边,
比如x = 1+21+2可以发到=的右边,所以 1+2可以是个右值;
但是 1+2 = x,这个语句中1+2不能放到等号的左边,所以 1+2不可能是左值。

let x = 5;

let number = match x {
    1 => "one",
    2 => "two",
    3 => "three",
    4 => "four",
    5 => "five",
    _ => "something else",
};

这个 match 语句完成了 数字字符 的转换,number中的值是 five 。

二、另外几个例子

单值、多值和范围匹配
let number = 13;   
println!("Tell me about {}", number);
match number {
    1 => println!("One!"),
    2 | 3 | 5 | 7 | 11 => println!("This is a prime"),
    13...19 => println!("A teen"),
    _ => println!("Ain't special"),
}
布尔值的例子
  let boolean = true;
  let binary = match boolean {
   false => 0,
    true => 1,
  };  
  println!("{} -> {}", boolean, binary);

这里不存在 _ =>这个 match-arm,是因为 true 和 false这两个值已经完全覆盖boolean的所有值域。

枚举的例子
enum Message {
    Quit,
    ChangeColor(i32, i32, i32),
    Move { x: i32, y: i32 },
    Write(String),
}

fn quit() { /* ... */ }
fn change_color(r: i32, g: i32, b: i32) { /* ... */ }
fn move_cursor(x: i32, y: i32) { /* ... */ }

fn process_message(msg: Message) {
    match msg {
        Message::Quit => quit(),
        Message::ChangeColor(r, g, b) => change_color(r, g, b),
        Message::Move { x: x, y: y } => move_cursor(x, y),
        Message::Write(s) => println!("{}", s),
    };

这里的 match msg 也没有实现 _ => 这个match-arm,是因为match msg 里面的值完全覆盖了枚举 Message 中的值,如果把match msg 中的任意一个 match-arm 去掉,就必须实现 _ => 语句了。

match msg {
        Message::ChangeColor(r, g, b) => change_color(r, g, b),
        Message::Move { x: x, y: y } => move_cursor(x, y),
        Message::Write(s) => println!("{}", s),
        _=> quit(),
    };
条件选择
let n  = 3;
match n  {
  n if n > 2 => println!("> 2"),
  n if n < 3 => println!("< 3"),
  _ => println!("some else"),
};

在 match-arm的 => 前面可以有一个if 条件,即使 match 匹配,还可以通过 if 进行过滤。

如果这样,又如何呢?

let n  = 4;
match n  {
  n if n > 2 => println!("> 2"),
  n if n > 3 => println!("> 3"),
  _ => println!("some else"),
};

match 遇到第一个匹配的结果,就不再往下继续匹配了,只执行第一个满足条件的语句。

上面的代码变体:

let n  = 4;
match n  {
  x => println!(" x = {}",x),
};

x 被赋值 n ,即:let x = n

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Rust 中,`match` 是一个强大的模式匹配表达式,用于处理多个可能的情况。 `match` 表达式由多个分支组成,每个分支包含一个模式和相应的代码块。当 `match` 表达式执行时,它会将待匹配的值与每个分支的模式进行比较,然后执行与匹配成功的分支相关联的代码块。 下面是一个示例,展示了如何使用 `match` 表达式: ```rust fn main() { let number = 5; match number { 1 => println!("One"), 2 => println!("Two"), 3 => println!("Three"), _ => println!("Other"), // `_` 是一个通配符,用于匹配所有其他情况 } } ``` 在这个示例中,我们使用 `match` 表达式来匹配 `number` 变量的值。根据匹配的结果,对应的代码块将会被执行。如果没有任何模式匹配成功,那么 `_` 分支将会被执行。 除了字面量模式(如上述示例中的数字),`match` 还支持其他类型的模式,如变量模式、通配符模式、引用模式等。你还可以使用 `|` 运算符来匹配多个模式。 下面是一个更复杂的示例,展示了如何使用 `match` 匹配不同的类型: ```rust fn main() { let value: Result<i32, &str> = Ok(10); match value { Ok(number) => println!("Success: {}", number), Err(message) => println!("Error: {}", message), } } ``` 在这个示例中,我们使用 `match` 来匹配 `value` 变量的类型。如果 `value` 是 `Ok` 枚举的实例,那么与 `Ok(number)` 匹配的代码块将会被执行。如果 `value` 是 `Err` 枚举的实例,那么与 `Err(message)` 匹配的代码块将会被执行。 通过使用 `match` 表达式,你可以根据不同的模式来处理不同的情况,使代码更加清晰和可读。你可以在 Rust 官方文档中了解更多关于 `match` 的详细信息和示例:https://doc.rust-lang.org/reference/expressions/match-expr.html

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值