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 的简单介绍和使用相关推荐
- Rust语言- 匹配器 match
Rust语言- 匹配器 match Rust中的match表达式有些类似其他语言中的switch 和 case 语句,=>左边是需要匹配的模式,=>右边是待执行的代码.需要注意的是,mat ...
- 过滤器匹配符包含单词_Hamcrest包含匹配器
过滤器匹配符包含单词 与Hamcrest 1.2相比 ,针对Matchers类的Hamcrest 1.3 Javadoc文档为该类的几种方法添加了更多文档. 例如,四个重载的contains方法具有更 ...
- spaCy V3.0 基于规则匹配(2)----高效的短语匹配器和依存句法匹配器
1 短语匹配器(PhraseMatcher) 1.1 基本用法 对于需要匹配大型术语列表的情况,可以通过PhraseMatcher和创建Doc对象来代替词符匹配模式(token patterns),可 ...
- easymock参数_EasyMock参数匹配器
easymock参数 EasyMock argument matchers allow us to provide the flexible argument for matching when st ...
- 3D人脸查看器和匹配器
目录 背景 技术 Mesh 文件 人脸图像 面部拟合 相机,灯光,动作 用户界面 代码高亮 演示 注意 更新 4.0版 Face Matcher的代码高亮 创建FaceServiceClient对象 ...
- 【图像配准】多图配准/不同特征提取算法/匹配器比较测试
前言 本文首先完成之前专栏前置博文未完成的多图配准拼接任务,其次对不同特征提取器/匹配器效率进行进一步实验探究. 各类算法原理简述 看到有博文[1]指出,在速度方面SIFT<SURF<BR ...
- 自己写 Netfilter 匹配器
看了Nicolas写的netfilter写匹配器,自己尝试编译测试,发现iptables 以及内核版本升级很多数据结构和函数接口都改变了,需要做大量的修改才能运行. 运行 iptables/netfi ...
- 设计模式之----匹配器处理器模式(Matcher-Handler)的理解
文章目录 1.前言 2.概念 3.应用场景 4.模式结构 5.案例实现 6.总结 1.前言 之前文章讲过策略模式,不懂的可以点击策略模式,今天再来说个策略模式的升级版(matcher-handler) ...
- 【OpenCV-Python】——哈里斯/Shi-Tomas角检测FAST/SIFT/ORB特征点检测暴力/FLANN匹配器对象查找
目录 前言: 1.角检测 1.1 哈里斯角检测 1.2 优化哈里斯角 1.3 Shi-Tomasi角检测 2.特征点检测 2.1 FAST特征点检测 2.2 SIFT特征检测 2.3 ORB特征检测 ...
- Spring路径匹配器AntPathMatcher
文章目录 PathMatcher接口 使用场景 接口方法 AntPathMatcher类 匹配规则 主要方法 1. isPattern 2. match 3. matchStart 4. extrac ...
最新文章
- IE9(测试版)浏览器实用快捷键使用方法
- Hadoop大数据分布式文件系统hdfs的工作机制
- Oracle数据库安然计谋分析(二)
- 上项线体表位置_实用人体体表解剖:头颈部(高清大图版)
- dotnet vs code mysql_.net 5 用vs code链接mysql体验
- FFmpeg - 音频解码过程
- ML.NET 9月更新
- pandas 选取第一行_用pandas中的DataFrame时选取行或列的方法
- UVa 11889 (GCD) Benefit
- win10+ubuntu18.04双系统配置深度学习环境
- 将txt格式的地图导入到ArcMap
- Android音频数据格式概述
- 编译过程 多个.c文件 . h文件 和main文件的 联系
- UvaLA 4670 Dominating Patterns
- win10 双屏显示 鼠标可以从主屏幕左侧滑入右侧竖屏
- access里面的表达式运用_表达式的示例
- 万象:庸人容易因欠缺自知之明而自我膨胀
- agv系统介绍_智能自动化物流系统AGV基础知识(完整介绍)
- Ubuntu 14.10 安装 hadoop-2.6.0单机配置和伪分布式配置
- 那年的夏天很笛子 : )