首页 > 其他分享 >06.枚举与模式匹配

06.枚举与模式匹配

时间:2022-11-27 19:24:01浏览次数:34  
标签:Null 06 Option Some 枚举 let Coin 模式匹配

定义枚举

  • IP地址:IPv4、IPv6
enum  IpAddrKindf {
    V4,
    V6
}

枚举值

  • let four =lpAddrKind::V4;
  • let six = lpAddrKind::V6;

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

  • 优点:
    • 不需要额外使用 struct
    • 每个变体可以拥有不同的类型以及关联的数据量
enum  IpAddrKindf {
    V4(u8,u8,u8,u8),
    V6(String)
}

为枚举定义方法

  • 也使用impl关键字

Option 枚举

  • 定义于标准库中
  • 在 Prelude(预导入模块)中
  • 描述了:某个值可能存在(某种类型) 或不存在的情况

Rust 没有 Null

  • 其它语言中:
    • Null 是一个值,它表示“没有值”
    • 一个变量可以处于两种状态: 空值 (null)、非空
  • Null 引用: Billion Dollar Mistake
  • Null 的问题在于:当你尝试像使用非 Null 值那样使用 Nul 值的时候,就会引起某种错误
  • Null的概念还是有用的:因某种原因而变为无效或缺失的值

Rust 中类似 Null 概念的枚举 - Option

  • 标准库中的定义:
enum Option<T> {
    Some(T),
    None
}
  • 它包含在 Prelude (预导入模块) 中。可直接使用:
    • Option
    • Some(T)
    • None
fn main() {
    let some_number=Some(5);
    let some_string=Some("A String");
    let absernt_number:Option<32>=None;
}

Option 比 Null 好在哪?

  • Option 和T是不同的类型,不可以把 Option 直接当成T
  • 若想使用 Option 中的 T,必须将它转换为 T
  • 而在C# 中:
    • string a = null;
    • string b=a +“12345”

控制流运算符 match

  • 允许一个值与一系列模式进行匹配,并执行匹配的模式对应的代码
  • 模式可以是字面值、变量名、通配符...
enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter
}
fn value_in_cents(coin:Coin)->u8 {
    match coin {
        Coin::Penny=>1,
        Coin::Nickel=>5,
        Coin::Dime=>10,
        Coin::Quarter=>25
    }
}

绑定值的模式

  • 匹配的分支可以绑定到被匹配对象的部分值。
    • 因此,可以从 enum 变体中提取值
enum UsState {
    Alabama,
    Alaska
}

enum Coin {
    Quarter(UsState)
}
fn value_in_cents(coin:Coin)->u8 {
    match coin {
        Coin::Quarter(UsState)=>{

        }
    }
}

匹配Option

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

match 匹配必须穷举所有的可能

  • _通配符:替代其余没列出的值
fn plus_one(x:Option<i32>)->Option<i32> {
    match x {
        None=>None,
        _ =>()
    }
}

if let

  • 处理只关心一种匹配而忽略其它匹配的情况
let v=Some(0u8);
if let Some(3) = v {
    println!("three");
}
  • 更少的代码,更少的缩进,更少的模板代码
  • 放弃了穷举的可能
  • 可以把iflet 看作是 match 的语法糖
  • 搭配 else
let v=Some(0u8);
if let Some(3) = v {
    println!("three");
}else {
    println!("others");
}

标签:Null,06,Option,Some,枚举,let,Coin,模式匹配
From: https://www.cnblogs.com/huiteresa/p/16930373.html

相关文章

  • 二进制枚举(三)
        下面继续通过几个示例体会二进制枚举方法的应用。【例1】建造碉堡问题描述设有一个街道笔直的方形城市。该城市的地图是一个有n行和n列的正方形,每行代表一条......
  • DlgOpengl-06 纹理
    纹理,用过三维建模软件的应该知道它是什么,三维软件的纹理就是给一个三角面绘制一个贴图,可以是图片,也可以是一种依靠灰度进行的诸如烟雾,置换,或者噪波等等类似的操作。之前使......
  • TypeScript学习笔记-06 类、构造器、继承、super
    //使用类来定义一个类classPerson{//readonly开头的表示只读的属性,无法进行修改//定义实例属性readonlyname:string='索隆';//静态属性......
  • 06 样本及抽样分布 | 概率论与数理统计
    1.随机样本1.总体与个体总体:研究对象的全体,即试验的全部可能观察值称为总体个体:总体当中的每个对象,总体中的每个可能观察值成为个体容量:总体中所包含的个体的个数称......
  • 060 MITSUBISHI SERVO
    1.,......
  • 06-面向对象_继承
    typora-root-url:images一、简介1.1、问题引入​ 在现实生活中,继承一般指的是子女继承父辈的财产。在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物......
  • jquery006-点赞
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><style>.click{color:darkred;positio......
  • 06-1-2大屏实时计算技术的深度剖析【双元】(1) flink写入es和kafka ---(2)flink案例代
                                                        ......
  • 字符串模式匹配算法 C++
    #include<iostream>#include<vector>#include<string>usingnamespacestd;//处理模式串,每一个位置都赋值为已匹配的位数vector<int>next_pos(stringpattern){ ......
  • Introduction to Computer Science #Homework 06
    IntroductiontoComputerScienceHomework061.程序是如何执行的3.2.1给寄存器R赋值20CPU将寄存器R中的值存回a所在的地址3.2.2将主存中1200地址处的值读取到寄......