【跟小嘉学 Rust 编程】六、枚举和模式匹配

news/2024/7/24 8:39:51 标签: rust, 开发语言, 后端

系列文章目录

【跟小嘉学 Rust 编程】一、Rust 编程基础
【跟小嘉学 Rust 编程】二、Rust 包管理工具使用
【跟小嘉学 Rust 编程】三、Rust 的基本程序概念
【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念
【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据
【跟小嘉学 Rust 编程】六、枚举和模式匹配

文章目录

  • 系列文章目录
    • @[TOC](文章目录)
  • 前言
  • 一、定义枚举
    • 1.1、定义枚举
      • 1.1.1、枚举的定义
      • 1.1.2、枚举的值
      • 1.1.3、将数据附加到枚举的变体中
    • 1.2、可选枚举(Option)
  • 二、match 流程控制结构
    • 2.1、控制流运算符(match)
    • 2.2、模式绑定值
    • 2.3、匹配 `Option<T>`
    • 2.4、match 匹配到时候必须穷举所有的可能性
  • 三、 带有 if let 的简明控制流
    • 3.1、 if let 使用
    • 3.2、 if let 搭配 else 使用
  • 总结

前言

本章节

主要教材参考 《The Rust Programming Language》


一、定义枚举

1.1、定义枚举

1.1.1、枚举的定义

枚举允许您通过枚举其可能的变体来定义类型。使用 enum 关键字定义枚举类型。

rust">#[allow(unused)]
#[derive(Debug)]
enum IpAddrKind {
  V4,
  V6,
}

1.1.2、枚举的值

枚举值使用 :: 获取

rust">#[allow(unused)]
#[derive(Debug)]
enum IpAddrKind {
  V4,
  V6,
}

fn main() {
  let ipv4 =IpAddrKind::V4;
  let ipv6 = IpAddrKind::V6;

  println!("{:?}", ipv4);
  println!("{:?}", ipv6);
}

1.1.3、将数据附加到枚举的变体中

优点:

  • 不需额外使用struct 存储;
  • 每个变体可以拥有不同的类型以及关联的数据;
rust">#[allow(unused)]
#[derive(Debug)]
enum IpAddrKind {
  V4(u8,u8,u8, u8),
  V6(String),
}

fn main() {
  let ipv4 =IpAddrKind::V4(127,0,0,1);
  let ipv6 = IpAddrKind::V6(String::from("::1"));

  println!("{:?}", ipv4);
  println!("{:?}", ipv6);
}

1.2、可选枚举(Option)

定义与标准库,用于描述一个值可能存在或者不存在的情况。在java或C/CPP之中存在有 NULL(表示空值),一个变量可能处于两种状态:空值(nulll)、非空。

可选枚举的定义

rust">enum Option<T>{
   Some(T),
   None
}

它定义在 Prelude (预导入模块)中,可直接使用

  • Option
  • Some(T)
  • None
rust">fn main() {
  let some_number = Some(5);
  let some_string  = Some(String::from("hello"));
  let absent_number :Option<i32> = None;
}

当你要使用 None 来初始化变量的时候,不能省略类型。Option 要想与 T 类型数据参与运算 必须先转换为 T 类型。

二、match 流程控制结构

2.1、控制流运算符(match)

  • 允许一个值与一系列模式进行匹配,并执行匹配的模式对应的代码
  • 模式可以是字面量、变量名、通配符等等
rust">enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter,
}

fn value_in_cents(coin: Coin) -> u8 {
    match coin {
        Coin::Penny => {
        	println!("lucky penny!");
        },
        Coin::Nickel => 5,
        Coin::Dime => 10,
        Coin::Quarter => 25,
    }
}

2.2、模式绑定值

匹配的分支可以绑定到被匹配对象的部分值,因此可以从 enum 变体中提取值

rust">#[derive(Debug)] 
enum UsState {
    Alabama,
    Alaska,
    // --snip--
}

#[allow(unused)]
enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter(UsState),
}

fn value_in_cents(coin: Coin) -> u8 {
  match coin {
      Coin::Penny => 1,
      Coin::Nickel => 5,
      Coin::Dime => 10,
      Coin::Quarter(state) => {
          println!("State quarter from {:?}!", state);
          25
      }
  }
}

fn main() {
  let c = Coin::Quarter(UsState::Alaska);
  println!("{:?}", value_in_cents(c));

}

2.3、匹配 Option<T>

rust">fn plus_one(x: Option<i32>) ->  Option<i32> {
  match x {
    None => None,
    Some(i) => Some(i+1),
  }
}

fn main() {
   let six = plus_one(Some(5));
   let none = plus_one(None);

   println!("{:?}", six);
   println!("{:?}", none);
}

2.4、match 匹配到时候必须穷举所有的可能性

match 匹配到时候必须穷举所有的可能性,如果不匹配就会有错误,但是我们在使用 match 匹配的时候,会有存在的可能性比较多的情况,我们可以使用 _ 来替代其余没列出的值

rust">
fn main() {
  let x:u8= 1u8;
  match x {
    1=> println!("one"),
    2=> println!("two"),
    _=> ()
  }
}

三、 带有 if let 的简明控制流

3.1、 if let 使用

if let 控制流只关心一种匹配而忽略其他匹配的情况。

  • 更少的代码,更少的缩进,更少的模板代码;
  • 放弃来穷举的可能;
rust">fn main() {
  let config_max = Some(3u8);
  if let Some(max) = config_max {
      println!("The maximum is configured to be {}", max);
  }
}

3.2、 if let 搭配 else 使用

rust">
fn main() {
  let config_max = Some(8u8);
  if let Some(3) = config_max {
      println!("three");
  }else {
      println!("others");
  }
}

总结

以上就是今天要讲的内容

  • 1、如何定义枚举以及枚举的使用
  • 2、match 控制流
  • 3、if let 控制流

http://www.niftyadmin.cn/n/467849.html

相关文章

Springboot-- 注解字段校验,并统一设置返回值

Springboot-- 注解字段校验&#xff0c;并统一设置返回值 引包&#xff1a;import org.springframework.validation.annotation.Validated; <!--web--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-star…

华为eNSP入门实验,Vlan配置,路由配置,用户模式,链路聚合

文章目录 一、同一交换机下的PC通信二、不交换机下的PC通信三、配置静态路由通信四、路由器rip协议配置五、路由器ospf协议配置六、单臂路由七、通过三层交换机使不同的Vlan能连通八、设备consolo密码模式九、设备consolo用户密码模式&#xff08;AAA模式&#xff09;十、Telne…

【kubernetes系列】Kubernetes中的重要概念

​ 在学习k8s之前&#xff0c;必须先了解 Kubernetes 的几个重要概念&#xff0c;它们是组成 Kubernetes 集群的基石。&#xff08;参考Kubernetes权威指南&#xff09; 一、Master Kubernetes 里的Master指的是集群的控制节点&#xff0c; 每个Kubernetes 集群里至少需要有一…

API 接口协作,swagger不再是第一选择了

目录 一、前言 1.1. 场景一、后端视角&#xff1a; 1.2. 场景二、前端视角&#xff1a; 1.3. 场景三、测试视角&#xff1a; 二、Apifox 2.1 场景一、后端视角&#xff1a; 漂亮的接口文档 2.2 场景二、前端视角&#xff1a; 2.3 场景三、测试视角&#xff1a; 三、总…

HTML5+css3:3D旋转木马效果相册实现

1 、 perspective perspective 属性包括两个属性&#xff1a; none 和具有单位的长度值。 其中 perspective 属性的默认值为 none &#xff0c;表示无限的角度来看 3D 物体&#xff0c;但看上去是平的。另一个值 <length> 接受一个长度单位 大于 0 的值。而且其单位不…

以太网通信的回环测试

PHY 芯片通常带有回环&#xff08;Loopback&#xff09;功能&#xff0c;用于 PHY 通信链路的测试。本文主要讨论三种常用 PHY 芯片的回环功能&#xff0c;并使用 Broadcom 的 B50612D 芯片进行 PHY 回环测试。 1 常见PHY芯片的回环功能 1.1 KSZ9031 KSZ9031 芯片支持以下两种…

Istio 熔断 连接池 故障处理

istio熔断 熔断主要是无感的处理服务异常并保证不会发生级联甚至雪崩的服务异常。在微服务方面体现是对异常的服务情况进行快速失败&#xff0c;它对已经调用失败的服务不再会继续调用&#xff0c;如果仍需要调用此异常服务&#xff0c;它将立刻返回失败。 与此同时&#xff0…

chatgpt赋能python:PythonGUI编程简介

Python GUI编程简介 Python是一款功能强大的开源编程语言&#xff0c;在很多领域都有广泛的应用。与其他编程语言相比&#xff0c;Python具有易于学习、易于阅读和易于维护等优点&#xff0c;因此成为许多程序员选择的首选语言之一。Python还提供了许多各种类型的GUI库&#x…