首页 > 其他分享 >rust 初探 -- 枚举和模式匹配

rust 初探 -- 枚举和模式匹配

时间:2024-07-24 18:27:49浏览次数:17  
标签:Option -- 枚举 Num let fn println match rust

rust 初探 – 枚举和模式匹配

定义枚举

enum IpAddrKind {
    // 将数据附加到枚举的变体中
    // - 不需要额外使用 struct
    // - 每个变体可以拥有不同的类型以及关联的数据量
    V4(String), 
    V6(String),
}
  • 可以使用 impl 为枚举定义方法
 enum IpAddrKind {
    a,
    b(String),
    c{x: i32, y: i32},
}

impl IpAddrKind {
    fn call(&self) {}
}

fn main() {
    let aa = IpAddrKind::a;
    let bb = IpAddrKind::b(String::from("hello"));
    let cc = IpAddrKind::c { x: 12, y: 21 };

    bb.call();
}

Option 枚举

  • 定义在标注库中,在 Prelude(预导入模块)中

rust 没有 Null

  • Null 的问题:当你尝试像使用非 Null 值那样使用 Null 值的时候,就会引起某种错误
  • Null 的作用:因某种原因而变为无效或缺失的值(Option)
Option 的优点
  • Option 和 T 是不同的类型,不可以把 Option 直接当作 T
  • 若想使用 Option 中的 T,必须把它转换成 T,避免了错误使用 null 进行操作(非Option 的肯定不是空的,否则就需要转换)
    示例:
fn main() {
    let x: i8 = 5;
    let y: Option<i8> = Some(5);
	//将 Option<T> 中的 T 转换成 T
    let yy = y.expect("get Option<i8> fail");
    let sum = x + yy;
    println!("{}", sum)
}

match

  • 允许一个值与一系列模式进行匹配,并执行匹配的模式对应的代码(示例)
enum Num {
    One,
    Two,
    Three,
}

fn value_in_cents(num: Num) -> u8 {
    // 依次匹配
    match num {
        Num::One => {
            println!("match One");
            1
        },
        Num::Two => 2,
        Num::Three => 3,
    }
}


fn main() {
    let num = Num::One;

    println!("{}", value_in_cents(num))
}
  • 绑定值的模式:匹配的分支可以绑定到被匹配对象的部份值,可以从 enum 变体中提取值

#[derive(Debug)]
enum Name {
    Tim,
    Hope,
}
enum Num {
    One,
    Two,
    Three(Name),
}

fn value_in_cents(num: Num) -> u8 {
    // 依次匹配
    match num {
        Num::One => {
            println!("match One");
            1
        },
        Num::Two => 2,
        Num::Three(name) => {
            println!("three name is: {:#?}", name);//three name is: Hope
            3
        },
    }
}

fn main() {
    let num = Num::Three(Name::Hope);

    println!("{}", value_in_cents(num)) // 3
}

匹配 Option

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

    // println!("{}, {}", six, none);
}


fn plus_one(x: Option<i32>) -> Option<i32> {
    match x {
        None => None,
        Some(i) => Some(i+1),
    }
}
  • match 匹配必须穷举所有的可能性(会在编译时检查),如果不需要处理,可以使用通配符“_”替代:
fn main() {
    let v = 0u8;
    match v {
        1 => println!("one"),
        2 => println!("two"),
        _ => (),
    }
}

if let

  • 处理只关注一种匹配,而忽略其他匹配的情况
  • 更少的代码,更少的缩进,更少的模版代码
  • 但是放弃了穷举的可能
fn main() {
    let v = 0u8;
    match v {
        2 => println!("two"),
        _ => println!("other"),
    }
	// 等效于上面的逻辑
    if let 2 = v {
        println!("two");
    } else {
    	println!("other");
    }
}

标签:Option,--,枚举,Num,let,fn,println,match,rust
From: https://blog.csdn.net/shenyongsi/article/details/140659222

相关文章

  • 打卡信奥刷题(417)用Scratch图形化工具信奥P10416[普及组/提高] [蓝桥杯 2023 国 A] XYZ
    [蓝桥杯2023国A]XYZ题目描述给定一个区间[L,R][L,R]......
  • 2024年全国职业院校(中职组)技能大赛(ZZ052大数据应用与服务)持续更新中!
    2024年职业院校中职组ZZ052大数据应用与服务赛项赛题第01套【子任务一:基础环境准备】##模块一:平台搭建与运维(一)任务一:大数据平台搭建本模块需要使用root用户完成相关配置;所有组件均在/root/software目录下。1.子任务一:基础环境准备master、slave1、slave2......
  • 力扣高频SQL 50题(基础版)第九题
    文章目录力扣高频SQL50题(基础版)第九题197.上升的温度题目说明思路分析实现过程准备数据实现方式结果截图总结力扣高频SQL50题(基础版)第九题197.上升的温度题目说明Weather±--------------±--------+|ColumnName|Type|±--------------±--------+......
  • 力扣高频SQL 50题(基础版)第八题
    文章目录力扣高频SQL50题(基础版)第八题1581.进店却未进行过交易的顾客题目说明思路分析实现过程准备数据:实现方式:结果截图:总结:力扣高频SQL50题(基础版)第八题1581.进店却未进行过交易的顾客题目说明表:Visits±------------±--------+|ColumnName|Type|......
  • 运营商三要素验证在金融行业的使用
    在现代金融业务中,尤其是互联网金融领域,数勋API运营商三要素验证--即手机号、姓名、身份证号的匹配验证--已经成为了检测和预防诈骗的首选手段,准确性和实时性是上述要素在风险控制中重要应用的基础。查看数勋API运营商三要素:百度搜索杭州数勋科技有限公司银行开户在银行开户......
  • 股票市场预测模型:未来趋势的智能分析工具
    ......
  • 网络运维工程师的全面工作指南与命令参考
     在我们当今数字化的时代,网络运维工程师的角色变得日益重要,本文将深入探讨网络运维工程师的主要职责,并通过具体的命令示例,展示作为一位网络工程师要如何使用各种工具来进行工作。网络监控网络监控是运维工程师的日常工作之一,目的是实时了解网络状态,快速响应任何可能影响业......
  • FreeModbus学习——eMBInit初始化
    FreeModbus版本:1.6在mb.c文件中先看一下静态变量的定义/*-----------------------Staticvariables---------------------------------*/staticUCHARucMBAddress;staticeMBModeeMBCurrentMode;ucMBAddress是从机地址,eMBCurrentMode是Modbus的工作模式,如......
  • 【保留数据精度】:round函数与`format`函数的比较
    保留数据精度:round函数与format函数的比较摘要在数据处理和编程中,数据精度的保留是一个重要的议题。round函数用于四舍五入到指定的小数位数,而format函数则用于格式化数字为字符串,通常也包括小数位数的控制。本文将分析这两个函数在数据保留上的差异、使用场景以及可能遇......
  • FreeModbus学习——eMBPoll轮询
    FreeModbus版本:1.6eMBPoll在mb.c文件中eMBPoll函数是一个核心的Modbus协议栈事件处理函数,负责接收和发送帧,处理不同的事件,并根据需要返回错误码。eMBErrorCodeeMBPoll(void){staticUCHAR*ucMBFrame;//接收到的帧数据staticUCHARucRc......