使用过正則表達式的人应该都知道 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

Rust 1.7.0 匹配器 match 的简介和使用的更多相关文章

  1. EassyMock实践 自定义参数匹配器

    虽然easymock中提供了大量的方法来进行参数匹配,但是对于一些特殊场合比如参数是复杂对象而又不能简单的通过equals()方法来比较,这些现有的参数匹配器就无能为力了.easymock为此提供了I ...

  2. 前端测试框架Jest系列教程 -- Matchers(匹配器)

    写在前面: 匹配器(Matchers)是Jest中非常重要的一个概念,它可以提供很多种方式来让你去验证你所测试的返回值,本文重点介绍几种常用的Matcher,其他的可以通过官网api文档查看. 常用的 ...

  3. Flask入门之自定义过滤器(匹配器)

    1.  动态路由的匹配器? 不知道这种叫啥名,啥用法,暂且叫做匹配器吧. Flask自带的匹配器可以说有四种吧(保守数字,就我学到的) 动态路由本身,可以传任何参数字符串或者数字,如:<user ...

  4. 【Jest】笔记二:Matchers匹配器

    一.前言 什么是匹配器? 我们可以把匹配器看成,testng断言,这么理解就可以了 二.常用的匹配器 test('two plus two is four', () => { expect(2 ...

  5. BF匹配器

    对于BF匹配器,首先我们得用cv2.BFMatcher()创建BF匹配器对象.它取两个可选参数,第一个是normType.它指定要使用的距离量度.默认是cv2.NORM_L2.对于SIFT,SURF很 ...

  6. Rspec: everyday-rspec实操。FactoryBot预构件 (rspec-expectations gem 查看匹配器) 1-4章

    总文档连接: RSpec.info/documentation/ 包括core, expectiation,rails , mock, 点击最新版本,然后右上角搜索class, method. 第3章 ...

  7. Mockito 2 参数匹配器

    Mockito 通过使用 equals() 这种自然的 Java 样式来校验参数值.有时候,当需要有其他一些灵活性的时候,你可能会要求使用参数匹配(argument matchers). 请参考下面的 ...

  8. JUnit4---Hamcrest匹配器常用方法总结

    一.Hamcrest是什么? Hamcrest is a library of matchers, which can be combined in to create flexible expres ...

  9. [Google Guava]字符串处理:连接器、拆分器、字符匹配器

    一.连接器[Joiner] 二.拆分器[Splitter] 三.字符匹配器[CharMatcher] 四.字符集[Charsets] Charsets:针对所有Java平台都要保证支持的六种字符集提供 ...

随机推荐

  1. 区间DP || HDU 6249 Alice’s Stamps

    题意:标号为1-n的n种邮票,m个邮票集,每个集里有标号从Li到Ri的邮票,要从中选K个邮票集,使这K个邮票集能覆盖最多种的邮票,问最多能覆盖多少种邮票 思路:区间DP (我:??? f[i][j]表 ...

  2. 暑假集训 || 区间DP

    区间DP 经典石子合并问题V1    复杂度 On3 int a[SZ], sum[SZ], f[SZ][SZ]; int main() { int n; scanf("%d", ...

  3. 二分+贪心 || CodeForces 551C GukiZ hates Boxes

    N堆石头排成一列,每堆有Ai个石子.有M个学生来将所有石头搬走.一开始所有学生都在原点, 每秒钟每个学生都可以在原地搬走一块石头,或者向前移动一格距离,求搬走所有石头的最短时间. *解法:二分答案x( ...

  4. C++友元函数和运算符重载

    非成员友元函数.成员友元函数和友元类 1.友元的作用: (1)友元提供了不同类的成员函数之间.类的成员函数与一般函数之间进行了数据共享的机制: 2.友元的优点和缺点 优点:提高程序的运行效率: 缺点: ...

  5. postman使用--发送请求

    概述 上节讲了下接口的基础,从现在来学习怎么测接口.当然,测试接口有很多的工具,比如postman,jmeter等等,或者用代码测试,如果是做接口自动化我当然会选python,如果是调试接口,我特别喜 ...

  6. 操作系统复习——如何查看一个进程的详细信息,如何追踪一个进程的执行过程 ,如何在 Linux 系统下查看 CPU、内存、磁盘、IO、网卡情况?epoll和select区别?

    1. 如何查看一个进程的详细信息,如何追踪一个进程的执行过程 通过pstree命令(根据pid)进行查询进程内部当前运行了多少线程:# pstree -p 19135(进程号) 使用top命令查看(可 ...

  7. dell服务器快速设置idrac

    前提:将服务器专用的idrac网络接口,连接到网络上 1.登录到服务器(即被监控的服务器). 2.安装客户端工具 yum  install  OpenIPMI OpenIPMI-devel OpenI ...

  8. 如何用纯 CSS 创作一种侧立图书的特效

    效果预览 在线演示 按下右侧的"点击预览"按钮在当前页面预览,点击链接全屏预览. https://codepen.io/zhang-ou/pen/deVgRM 可交互视频教程 此视 ...

  9. JS中的方法运用笔记

    1.警告(alert 消息对话框) alert(字符串或变量); <script type="text/javascript"> var mynum = 30; ale ...

  10. POJ 3259 Wormholes(负权环路)

    题意: 农夫约翰农场里发现了很多虫洞,他是个超级冒险迷,想利用虫洞回到过去,看再回来的时候能不能看到没有离开之前的自己,农场里有N块地,M条路连接着两块地,W个虫洞,连接两块地的路是双向的,而虫洞是单 ...