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

这篇具有很好参考价值的文章主要介绍了【跟小嘉学 Rust 编程】六、枚举和模式匹配。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系列文章目录

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

前言

本章节

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


一、定义枚举

1.1、定义枚举

1.1.1、枚举的定义

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

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

1.1.2、枚举的值

枚举值使用 :: 获取

#[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 存储;
  • 每个变体可以拥有不同的类型以及关联的数据;
#[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)、非空。

可选枚举的定义

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

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

  • Option
  • Some(T)
  • None
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)

  • 允许一个值与一系列模式进行匹配,并执行匹配的模式对应的代码
  • 模式可以是字面量、变量名、通配符等等
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 变体中提取值

#[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>

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 匹配的时候,会有存在的可能性比较多的情况,我们可以使用 _ 来替代其余没列出的值


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

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

3.1、 if let 使用

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

  • 更少的代码,更少的缩进,更少的模板代码;
  • 放弃来穷举的可能;
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 使用


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

总结

以上就是今天要讲的内容文章来源地址https://www.toymoban.com/news/detail-548302.html

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

到了这里,关于【跟小嘉学 Rust 编程】六、枚举和模式匹配的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Rust之枚举与模式匹配

    枚举类型,简称枚举,允许列举所有可能的值来定义一个类型。 枚举类型:已知所有可能的值,并且所有值的出现是互斥的,即每次只能取一种可能的值,才使用枚举类型。 示例:声明一个枚举 使用IpAddrKind中的两个变体来创建实例: 注:枚举的变体全部处于其标识符的命

    2024年02月15日
    浏览(40)
  • rust学习-枚举和模式匹配

    从ip地址入手学枚举 枚举的每个成员可以处理不同类型和数量的数据 使用枚举来存储两种不同 IP 地址的几种可能的选择 可以将任意类型的数据放入枚举成员中,甚至枚举中放枚举 虽然标准库中包含一个 IpAddr 的定义,仍然可以创建和使用自己的定义而不会有冲突,因为并没

    2024年02月16日
    浏览(37)
  • 【跟小嘉学 Rust 编程】十七、面向对象语言特性

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

    2024年02月10日
    浏览(85)
  • 【跟小嘉学 Rust 编程】十三、函数式语言特性:迭代器和闭包

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

    2024年02月11日
    浏览(57)
  • 【跟小嘉学 Rust 编程】三十三、Rust的Web开发框架之一: Actix-Web的基础

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

    2024年02月04日
    浏览(49)
  • 【跟小嘉学 Rust 编程】一、Rust 编程基础

    【跟小嘉学 Rust 编程】一、Rust 编程基础 本系列旨在分享 Rust 学习心得,适合初学者入门,后续系列会有 Rust 项目实战系列编程介绍。 主要教材参考 《The Rust Programming Language》 Rust 是一门新的编程语言,它可以让每个人编写可靠且高效的程序,使用于需要运行时速度、需要内

    2024年02月10日
    浏览(43)
  • 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念

    【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 本章节涵盖几乎所有编程语言会出现的概念以及他们在 Rust之中的工作原理,这不是 Rust 独有的,但我们将在 Rust 上下文中讨论他们,并且

    2024年02月10日
    浏览(42)
  • 【跟小嘉学 Rust 编程】三十、Rust 使用 Slint UI

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

    2024年02月04日
    浏览(41)
  • 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念

    【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 本章节将讲解 Rust 独有的概念(所有权)。所有权是 Rust 最独特的特性,它使得 Rust 能够

    2024年02月10日
    浏览(44)
  • 【跟小嘉学 Rust 编程】二十一、网络编程

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

    2024年02月10日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包