随笔 - 73  文章 - 0 评论 - 41 阅读 - 26439
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

Rust的枚举介绍

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

enum IpAddrKind {
    V4(u8,u8, u8, u8),
    V6(String)
}
let home = IpAddrKind::V4(127001);
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(i32i32i32)//持有的数据类型是元组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}),
_=>(),//_ 其他情况,() 什么也不做
}
posted on   hrx521  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
历史上的今天:
2009-11-19 给dataGridView 添加合计行的实现方法
2007-11-19 让.NET做的winform程序脱离.NET框架运行,有什么好办法吗??
点击右上角即可分享
微信分享提示