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}),
_=>(),//_ 其他情况,() 什么也不做
}
浙公网安备 33010602011771号