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+2
,1+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 的简介和使用的更多相关文章
- EassyMock实践 自定义参数匹配器
虽然easymock中提供了大量的方法来进行参数匹配,但是对于一些特殊场合比如参数是复杂对象而又不能简单的通过equals()方法来比较,这些现有的参数匹配器就无能为力了.easymock为此提供了I ...
- 前端测试框架Jest系列教程 -- Matchers(匹配器)
写在前面: 匹配器(Matchers)是Jest中非常重要的一个概念,它可以提供很多种方式来让你去验证你所测试的返回值,本文重点介绍几种常用的Matcher,其他的可以通过官网api文档查看. 常用的 ...
- Flask入门之自定义过滤器(匹配器)
1. 动态路由的匹配器? 不知道这种叫啥名,啥用法,暂且叫做匹配器吧. Flask自带的匹配器可以说有四种吧(保守数字,就我学到的) 动态路由本身,可以传任何参数字符串或者数字,如:<user ...
- 【Jest】笔记二:Matchers匹配器
一.前言 什么是匹配器? 我们可以把匹配器看成,testng断言,这么理解就可以了 二.常用的匹配器 test('two plus two is four', () => { expect(2 ...
- BF匹配器
对于BF匹配器,首先我们得用cv2.BFMatcher()创建BF匹配器对象.它取两个可选参数,第一个是normType.它指定要使用的距离量度.默认是cv2.NORM_L2.对于SIFT,SURF很 ...
- Rspec: everyday-rspec实操。FactoryBot预构件 (rspec-expectations gem 查看匹配器) 1-4章
总文档连接: RSpec.info/documentation/ 包括core, expectiation,rails , mock, 点击最新版本,然后右上角搜索class, method. 第3章 ...
- Mockito 2 参数匹配器
Mockito 通过使用 equals() 这种自然的 Java 样式来校验参数值.有时候,当需要有其他一些灵活性的时候,你可能会要求使用参数匹配(argument matchers). 请参考下面的 ...
- JUnit4---Hamcrest匹配器常用方法总结
一.Hamcrest是什么? Hamcrest is a library of matchers, which can be combined in to create flexible expres ...
- [Google Guava]字符串处理:连接器、拆分器、字符匹配器
一.连接器[Joiner] 二.拆分器[Splitter] 三.字符匹配器[CharMatcher] 四.字符集[Charsets] Charsets:针对所有Java平台都要保证支持的六种字符集提供 ...
随机推荐
- activitmq+keepalived+nfs 非zk的高可用集群构建
nfs 192.168.10.32 maast 192.168.10.4 savel 192.168.10.31 应对这个需求既要高可用又要消息延迟,只能使用变态方式实现 nfs部署 #yum ins ...
- git 超时 时长 设置?
[Pipeline] { (Checkout) [Pipeline] checkout > git.exe rev-parse --is-inside-work-tree # timeout=1 ...
- Word转html并移植到web项目
1.打开对应word文件 建议使用web视图查看文档 这样可以提前预览转转成html样式 2.如果有图片修改图片大小及格式 在web视图下,把图片调制适当大小,不然导出的html可能图片较小 3.点击 ...
- 出现了错误。详细消息: 3 uncommitted changes would be overwritten by merge
merge manual中有一条警告: 出现了错误.详细消息: 3 uncommitted changes would be overwritten by merge 有未提交修改情况下,不要执行me ...
- 牛客网NOIP赛前集训营-提高组(第二场)A 方差
链接:https://www.nowcoder.com/acm/contest/173/A来源:牛客网 题目描述 一个长度为 m 的序列 b[1...m] ,我们定义它的方差为 ,其中 表示序列的平 ...
- 5 SQL 复杂查询
5 复杂查询 5-1 视图 究竟视图是什么呢?如果用一句话概述的话,就是“从SQL的角度来看视图就是一张表”.实际上,在SQL语句中并不需要区分哪些是表,哪些是视图. 那么视图和表到底右什么不同呢?区 ...
- MySQL中的事务日志
一.事务日志的作用 事务日志在保证事务的特性的同时,提高事务的执行效率 二.事务日志的工作原理 使用事务日志时,存储引擎修改了表的数据时只需要修改其内存拷贝. 然后再将修改行为记录到持久在硬盘上的事务 ...
- Python简介--备份
脚本开头指定解释器路径 /usr/bin/env python 和 /usr/bin/python比较.(Linux在PATH中找到第一个路径的Python版本来执行) PATH中第一个路径是 ...
- vue 指令---气泡提示(手撸实战)
菜鸟学习之路//L6zt github 自己在造组件轮子,也就是瞎搞.自己写了个slider组件,想加个气泡提示.为了复用和省事特此写了个指令来解决.预览地址项目地址 github 我叫给它胡博 cs ...
- 前端基础之CSS_2
摘要 盒子模型 浮动 清除 溢出 定位 模态框 rgba 与 opacity透明区别 一.CCS盒子模型 margin:标签与标签之间的距离,主要用于控制标签周围间的间隔,从视觉上达到相互分开的目的 ...