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

时间: 2024-11-04 08:24:59

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

Rust 1.7.0的macro宏-语法分析和使用举例

macro 宏的概念在很多语言中都有. 通常情况下,宏的机制是在预编译阶段对已经定义的宏进行替换或者 expanded 展开 ,即:把宏按照名称替换成宏的内容. Rust 中的宏,与众不同! Rust中的宏,也是在预编译阶段进行处理.宏不仅仅是替换内容和展开,还可以像功能函数一样,接收参数.调用其他的宏. 一.简单的宏 宏的名称和功能函数名称很像,只不过在函数名称后面有一个叹号! 一个简单的宏定义和调用: macro_rules! say_hello{ ()=>( println!("He

自动化运维神器之saltstack (三)节点组及复合匹配器

saltstack实现远程配置管理功能首先是要先匹配到对应的target minion,然后才会将命令发送到匹配到的minion上去执行.这里介绍两种比较强大的匹配方法,一是创建节点组:二是使用复合匹配器. 节点组将不同的主机分配到不同的组中去,便于实现主机的集中化管理,接下来首先看salt分组功能的实现. 看下环境先: hadoop0.updb.com    192.168.0.100    OS:CentOS 6.5        Role:master uadoop1.updb.com  

saltstack 自动化运维神器(三)节点组及复合匹配器

saltstack实现远程配置管理功能首先是要先匹配到对应的target minion,然后才会将命令发送到匹配到的minion上去执行.这里介绍两种比较强大的匹配方法,一是创建节点组:二是使用复合匹配器. 节点组将不同的主机分配到不同的组中去,便于实现主机的集中化管理,接下来首先看salt分组功能的实现. 要使用salt的分组功能,需要在master节点上进行配置,配置的方式有两种: (1).将分组的信息写在master的主配置文件 (2).将分组的信息写在一个单独的配置文件中,然后主配置文件

OpenCV之特征检测器(Feature Detector),描述子提取器(Descriptor Extractor)和描述子匹配器(Descriptor Matcher)

1.特征检测子 -Harris cv::cornerHarris(image,strength,3,3,0.01); -Fast cv::Ptr<cv::FastFeatureDetector> fast = cv::FastFeatureDetector::create(); //或 cv::FAST(InputArray image, std::vector<KeyPoint> &keypoints, int threshold) //或 cv::FAST(InputA

前端测试框架Jest系列教程 -- 匹配器

写在前面: 匹配器(Matchers)是Jest中非常重要的一个概念,它可以提供很多种方式来让你去验证你所测试的返回值,本文重点介绍几种常用的Matcher,其他的可以通过官网api文档查看. 常用的匹配方式: 第一种:相等匹配,这是我们最常用的匹配规则 test('two plus two is four', () => { expect(2 + 2).toBe(4); }); 在这段代码中 expact(2 + 2) 将返回我们期望的结果,通常情况下我们只需要调用expect就可以,括号中的

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

写在前面: 匹配器(Matchers)是Jest中非常重要的一个概念,它可以提供很多种方式来让你去验证你所测试的返回值,本文重点介绍几种常用的Matcher,其他的可以通过官网api文档查看. 常用的匹配方式: 第一种:相等匹配,这是我们最常用的匹配规则 test('two plus two is four', () => { expect(2 + 2).toBe(4); }); 在这段代码中 expact(2 + 2) 将返回我们期望的结果,通常情况下我们只需要调用expect就可以,括号中的

shiro+密码匹配器验证登陆

1.先上工具类MD5Util   目前真正用到的是直接MD5加密的方法   未使用自定义加工密码加密 package cn.cjq.util; import cn.cjq.entity.User; import java.security.MessageDigest;import java.util.Random; public class MD5Util { /** * 加工密码,和登录一致. * @param user * @return */ public static User md5P

Rust 1.7.0 macro宏的复用 #[macro_use]的使用方法

Rust 1.7.0 中的宏使用范围包含三种情况: 第一种情况是宏定义在当前文件里.这个文件可能是 crate 默认的 module,也可能是随意的 module 模块. 另外一种情况是宏定义在当前 crate .可是不是在当前文件里,而是其它 module 模块中. 第三种情况是宏定义在其它的 crate 中.或者其它的 crate 子模块中. 使用#[macro_use] 能够使被注解的module模块中的宏应用到当前作用域中.或者凝视crate中的宏应用到当前crate作用域中. 第一种情

Solve error LNK2038: mismatch detected for &#39;_ITERATOR_DEBUG_LEVEL&#39;: value &#39;0&#39; doesn&#39;t match value &#39;2&#39;

This error happens in Release mode of VS2010, solve this problem by do following: . Go to Project Pages / Configuration Properties / C,C++ / Preprocessor / Preprocessor Definitions. Add '_ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH' Solve error LNK2038: mism