Rust入门之枚举与模式匹配

枚举

枚举允许我们列举一系列所有可能的值来定义一个类型

enum

定义一个简单的例子

fn main() {
    let ipv4 = IpAddressType::IpV4;
    let ipv6 = IpAddressType::IpV6;
    rout(ipv4);
    rout(ipv6);
}

fn rout(ip_address: IpAddressType){}

enum IpAddressType{
    IpV4,
    IpV6
}

将数据绑定在枚举的变体中

fn main() {
    let ipv4 = IpAddressType::IpV4(String::from("127.0.0.1"));
    let ipv6 = IpAddressType::IpV6(String::from("::1"));
    rout(ipv4);
    rout(ipv6);
}

fn rout(ip_address: IpAddressType){}

enum IpAddressType{
    IpV4(String),
    IpV6(String)
}

IPv4地址特殊,也可以变换成这样

fn main() {
    let ipv4 = IpAddressType::IpV4(127,0,0,1);
    let ipv6 = IpAddressType::IpV6(String::from("::1"));
    rout(ipv4);
    rout(ipv6);
}

fn rout(ip_address: IpAddressType){}

enum IpAddressType{
    IpV4(u8,u8,u8,u8),
    IpV6(String)
}

我们可以在枚举变体中使用任意类型的数据,比如还可以用struct

fn main() {
    let ipv4 = IpAddressType::IpV4(IpAddress{
        name:String::from("ipv4"),
        address:String::from("127.0.0.1")
    });
    let ipv6 = IpAddressType::IpV6(IpAddress{
        name:String::from("ipv6"),
        address:String::from("::1")
    });
    rout(ipv4);
    rout(ipv6);
}

fn rout(ip_address: IpAddressType){}

enum IpAddressType{
    IpV4(IpAddress),
    IpV6(IpAddress)
}

struct IpAddress{
    name: String,
    address:String
}

为枚举定义方法,使用impl关键字,此处用到了match,match在后续会讲到

fn main() {
    let ipv4 = IpAddressType::IpV4(IpAddress{
        name:String::from("ipv4"),
        address:String::from("127.0.0.1")
    });
    let ipv6 = IpAddressType::IpV6(IpAddress{
        name:String::from("ipv6"),
        address:String::from("::1")
    });
    ipv4.go();
    ipv6.go();
}

enum IpAddressType{
    IpV4(IpAddress),
    IpV6(IpAddress)
}
impl IpAddressType{
    fn go(&self){
        match self {
            IpAddressType::IpV4(v) => {
                println!("我是:{},我要跳转的地址是:{}",v.name,v.address)
            }
            IpAddressType::IpV6(v) => {
                println!("我是:{},我要跳转的地址是:{}",v.name,v.address)
            }
        }
    }
}
Option<T>

在其他语言中,NULL是一个值,它表示“没有值”,一个变量可以处于两种状态(空值(null)、非空)

所以Rust中有一个类似NULL的一个枚举Option<T>

标准库中定义如下

pub enum Option<T> {
    None,
    Some(T),
}

我们可以这样使用Option <T>

fn main() {

    let five = Some(5);
    let hello = Some("hello");
    let xx : Option<String> = None;
}

Option<T>与T是不同的,不能把Option<T>当成T,如果想使用Option<T>中的T,需要把Option<T>转为T。

fn main() {
    let v= 5;
    let five = Some(5);
    let y = match five {
        None => 0,
        Some(num) => num,
    };
    let x = v + y;
    println!("{}",x)
}
模式匹配
match

直接看例子

fn main() {
    let jiao = RMB::Jiao;
    let v = value(jiao);
    println!("结果:{}",v)
}

fn value(rmb:RMB)->i32{
    match rmb {
        RMB::Yuan => {1}
        RMB::Jiao => {10}
        RMB::Fen => {100}
    }
}

enum RMB{
    Yuan,
    Jiao,
    Fen,
}

穷举写法

当需要列举很多很多值的时候,而我们又只需要其中某几个值,那么我们可以使用"_"来表示

fn main() {
    let x = 0u8;
    let r = match x {
        1 => { 1 }
        2 => { 2 }
        3 => { 1 }
        _ => { 0 }
    };
}
if let

当控制流只有一种情况时,可以使用if let,可以用if let来简写match

fn main() {
    let x = 3;
    if let 3 = x {
        println!("匹配到了3")
    };
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cq-mengjiajie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值