使用过正则表达式的人应该都知道 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. Rust语言- 匹配器 match

    Rust语言- 匹配器 match Rust中的match表达式有些类似其他语言中的switch 和 case 语句,=>左边是需要匹配的模式,=>右边是待执行的代码.需要注意的是,mat ...

  2. 过滤器匹配符包含单词_Hamcrest包含匹配器

    过滤器匹配符包含单词 与Hamcrest 1.2相比 ,针对Matchers类的Hamcrest 1.3 Javadoc文档为该类的几种方法添加了更多文档. 例如,四个重载的contains方法具有更 ...

  3. spaCy V3.0 基于规则匹配(2)----高效的短语匹配器和依存句法匹配器

    1 短语匹配器(PhraseMatcher) 1.1 基本用法 对于需要匹配大型术语列表的情况,可以通过PhraseMatcher和创建Doc对象来代替词符匹配模式(token patterns),可 ...

  4. easymock参数_EasyMock参数匹配器

    easymock参数 EasyMock argument matchers allow us to provide the flexible argument for matching when st ...

  5. 3D人脸查看器和匹配器

    目录 背景 技术 Mesh 文件 人脸图像 面部拟合 相机,灯光,动作 用户界面 代码高亮 演示 注意 更新 4.0版 Face Matcher的代码高亮 创建FaceServiceClient对象 ...

  6. 【图像配准】多图配准/不同特征提取算法/匹配器比较测试

    前言 本文首先完成之前专栏前置博文未完成的多图配准拼接任务,其次对不同特征提取器/匹配器效率进行进一步实验探究. 各类算法原理简述 看到有博文[1]指出,在速度方面SIFT<SURF<BR ...

  7. 自己写 Netfilter 匹配器

    看了Nicolas写的netfilter写匹配器,自己尝试编译测试,发现iptables 以及内核版本升级很多数据结构和函数接口都改变了,需要做大量的修改才能运行. 运行 iptables/netfi ...

  8. 设计模式之----匹配器处理器模式(Matcher-Handler)的理解

    文章目录 1.前言 2.概念 3.应用场景 4.模式结构 5.案例实现 6.总结 1.前言 之前文章讲过策略模式,不懂的可以点击策略模式,今天再来说个策略模式的升级版(matcher-handler) ...

  9. 【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特征检测 ...

  10. Spring路径匹配器AntPathMatcher

    文章目录 PathMatcher接口 使用场景 接口方法 AntPathMatcher类 匹配规则 主要方法 1. isPattern 2. match 3. matchStart 4. extrac ...

最新文章

  1. IE9(测试版)浏览器实用快捷键使用方法
  2. Hadoop大数据分布式文件系统hdfs的工作机制
  3. Oracle数据库安然计谋分析(二)
  4. 上项线体表位置_实用人体体表解剖:头颈部(高清大图版)
  5. dotnet vs code mysql_.net 5 用vs code链接mysql体验
  6. FFmpeg - 音频解码过程
  7. ML.NET 9月更新
  8. pandas 选取第一行_用pandas中的DataFrame时选取行或列的方法
  9. UVa 11889 (GCD) Benefit
  10. win10+ubuntu18.04双系统配置深度学习环境
  11. 将txt格式的地图导入到ArcMap
  12. Android音频数据格式概述
  13. 编译过程 多个.c文件 . h文件 和main文件的 联系
  14. UvaLA 4670 Dominating Patterns
  15. win10 双屏显示 鼠标可以从主屏幕左侧滑入右侧竖屏
  16. access里面的表达式运用_表达式的示例
  17. 万象:庸人容易因欠缺自知之明而自我膨胀
  18. agv系统介绍_智能自动化物流系统AGV基础知识(完整介绍)
  19. Ubuntu 14.10 安装 hadoop-2.6.0单机配置和伪分布式配置
  20. 那年的夏天很笛子 : )

热门文章

  1. 前端必会的Vue项目请求方法模块化的高度封装操作案例说明——getData()方法封装实例,告别多次重复调用,解决页面代码冗余
  2. thinkphp6 task异步
  3. Gephi从入门到精通
  4. 根据银行账号判定所属银行
  5. MATLAB最简单教程
  6. 微信小程序使用字体图标
  7. idea 2019.3 集成SVN
  8. 比navicat还好用的mysql可视化工具
  9. 矩阵转置相关公式_线性代数入门——矩阵的转置运算及对称矩阵的概念
  10. 学习笔记-Bandit-WalkThrough