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表达式的参数使用引用方式传递,即采用不获取原变量的所有权的方式,如下图:
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}),
_=>(),//_ 其他情况,() 什么也不做
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
2009-11-19 给dataGridView 添加合计行的实现方法
2007-11-19 让.NET做的winform程序脱离.NET框架运行,有什么好办法吗??