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號