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}),
_=>(),//_ 其他情况,() 什么也不做
}
posted on 2024-11-19 19:33  hrx521  阅读(36)  评论(0)    收藏  举报