惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

U
Unit 42
罗磊的独立博客
博客园 - 聂微东
T
The Blog of Author Tim Ferriss
博客园 - 司徒正美
Stack Overflow Blog
Stack Overflow Blog
F
Fortinet All Blogs
A
About on SuperTechFans
腾讯CDC
Apple Machine Learning Research
Apple Machine Learning Research
B
Blog RSS Feed
IT之家
IT之家
V
Visual Studio Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
宝玉的分享
宝玉的分享
C
Check Point Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Vercel News
Vercel News
爱范儿
爱范儿
Microsoft Security Blog
Microsoft Security Blog
月光博客
月光博客
T
Tailwind CSS Blog
The Cloudflare Blog
Hugging Face - Blog
Hugging Face - Blog

博客园 - hrx521

微信公众号H5开发踩坑记:为什么POST返回的页面会显示HTML源码 SQL NOT IN 子查询存在 NULL 的经典行为陷阱--NULL 三值逻辑(TRUE / FALSE / UNKNOWN) SQL用窗口函数做逐行累计的实用用例 我的蝶翼斑马鱼繁殖要领总结 如何从操作系统的角度,理解C#语言的Async Await 异步机制内部状态机的运行原理? C#扩展方法对软件工程构建的促进示例和总结 基于原数据库新创建一个带部分数据做为初始数据的数据库的思路 sql调优记录,不要在join on 条件中使用过多的条件 发布和更新自己的nuget包 Rust语言特色语法记录 Rustup-init.exe安装后执行cargo run 报错:`link.exe` returned an unexpected error的解决办法 FastReport.OpenSource .Net下开源免费报表打印组件 SQL使用Merge在一个语句中完成插入、更新和删除操作 IIS应用程序回收导致应用中Hangfire等后台任务无法正常启动工作的解决方法 Microsoft.AspNetCore.Identity 的使用记录 C# xml文档反序列化记事 债券与债券基金 Linq补充学习 Blazor学习记录_12._IIS部署_组件的引用_HTML元素的引用 Blazor学习记录_11.身份认证与授权 Blazor学习记录_10.C#和JS互操作_访问WEB API Blazor学习记录_9.预呈现_渲染树
Rust的枚举类型Enum
hrx521 · 2024-11-19 · via 博客园 - hrx521

Rust的枚举介绍

Rust的枚举的变体可以持有值,并且每个变体持有的值的数据类型可以是不同的。

enum IpAddrKind {
    V4(u8,u8, u8, u8),
    V6(String)
}
let home = IpAddrKind::V4(127,0,0,1);
let loopback = IpAddrKind::V6(String::from("::1"));

可以为枚举实现方法,如下代码:

fn main(){
    let m=Message::Write(String::from("hello"));
    m.call();
}
enum Message {
    Quit,//Quit变体不持有数据
    Move {x:i32,y: i32 },//持有的数据是类型是结构体Struct
    Write(String),
    ChangeColor(i32,i32,i32)//持有的数据类型是元组Tuple
}
impl Message {
    fn call(&self){
    //...
    }
}

Option Enum 系统级的标准库内置声明的枚举

表示值存在或不存在两种变体的枚举。变体 None 就相当于其他语言中的null,rust语言没有null(不允许不确定),None变体即是从语言层面上处理null的方式

Enum Option<T>{
    None,
    Some(T)

}

Option及其变体 None、Some(T) 都是系统内置即Prelude的,所以可以直接使用,而不用指明一长串的命名空间。如下示例:

Let some_number = Some(5);//变量类型为Option<i32>
Let some_string = Some("a string");//变量类型为Option<String>
let absent_number:0ption<i32> = None;//变量类型为Option<i32>, 这里注意由于None是不指示类型的,所以声明时,必须指明变量absent_number时,须显示指明类型

match 表达式,用来控制流程

enum Coin {
Penny,
Nickel,
Dime,
Quarter,
}
fn value_in_cents(coin:Coin) => u8 {
    match coin {
    Coin::Penny => 1,
    Coin::Nickel => 5,
    Coin::Dime => 16,
    Coin::Quarter => 32,//如果Quarter同时持有数据,则写法示例为 Coin::Quarter(data: String){println!("{data}"); 32}
    }
}
//match 表达式的条件分支必须穷尽所有可能性

match 表达式如果直接传递变量,则会使的原变量换去所有权,而无法在继续使用。如下代码将在最后一行再次想使用 opt 时报错,因为数据在 Some(s:String) 这一行时被移动

fn main(){
    let opt:0ption<String>=Some(String::from(s:"Hello world"));
}
match opt {
    Some(s:String) => println!("Some: {}",s),//注:如果这里使用 Some(_) => println!("Some: Unused"),即在match花括号内未使用opt,则opt所有权不会移动 最后一行不会报错
    None => println!("None!")
}
println!("{:?}",opt);

所以,一般情况下,match表达式的参数使用引用方式传递,即采用不获取原变量的所有权的方式,如下图:
image

if let 当需要仅匹配一种情况时的控制流程表达式

// if let 结构读作:若 let 将 config_max 解构成 Some(max),则执行语句块{println!("The maximum number is }",max);}
if let Some(max:u8) = config_max {
    println!("The maximum number is }",max);
}

//如果使用match,则需要写出其他情况的表达式。
Let config_max= Some(3:u8);
match config_max{
Some(max:u8) => println!("The maximum is configured to be {max}),
_=>(),//_ 其他情况,() 什么也不做
}