枚举与模式匹配

本文介绍了Rust中的枚举类型,包括其定义、枚举值的使用、作为函数参数的应用以及模式匹配(match和iflet)的用法,展示了如何通过枚举结构存储不同类型的数据并进行操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 枚举

枚举是一种自定义数据类型,包含一些确定的值。 它在枚举名称之前使用enum关键字定义。

enum 枚举名 {
    枚举值,
    ...
}
// 样例
enum IpAddrKind {
    V4,
    V6,
}

1.1 枚举值

# [derive(Debug)]
enum WeekDay {
    MON,
    TUE,
    WED,
    THU,
    FRI,
    SAT,
    SUN,
}
// 枚举实例
let week_days = WeekDay::FRI;
let week2 = WeekDay::MON;

1.2 枚举作为函数参数

// 枚举类型作为函数参数
fn print_weekday(week : &WeekDay) {
    println!("today is {:?}", week)
}
// 函数调用
print_weekday(&week_days);

1.3 枚举成员绑定不同的数据类型

枚举值绑定不同的类型,使用枚举并将数据直接放进每一个枚举成员。c++语言没有这种用法。

enum WeekDay {
    MON(u32),
    TUE(String),
    WED(i32),
    THU(String),
    FRI,
    SAT,
    SUN,
}
let week_days = WeekDay::THU(String::from("星期二"));
let week1 = WeekDay::MON(1);
let week3 = WeekDay::WED(3);

如上 WeekDay枚举类型中一些枚举成员放入一些数据。

2 模式匹配

2.1 match匹配

​ 对于上述枚举成员绑定的数据如何取出来呢?这时候就用到了匹配。匹配是需要穷举的,有时候我们不需要匹配所有模式这时候可以用到通配模式_占位符

match week {
    WeekDay::MON(val) => println!("today is {}", val),   // val  = 1
    WeekDay::TUE(val) => println!("today is {}", val),   // val  = "星期二"
    WeekDay::WED(val) => println!("today is {}", val),   // val  = 3
    // other => println!("other deal ... {:?}", other),  // 通配模式
    _ => println!("other do not deal ..."),
}

由于 match需要穷举所有的枚举类型,但有时候我们不想一一列出,对于不关心的,有两种处理方式。

通配模式: 使用 other 表示,表示剩下的类型都直接给other变量,可以统一处理。

_占位符: 表示不用关心匹配的类型

2.2 if let简洁匹配

if let 语法让我们以一种不那么冗长的方式结合 iflet,来处理只匹配一个模式的值而忽略其他模式的情况。 if let 可以看作是 match 的语法糖。

let week_days = WeekDay::THU(String::from("星期二"));
if let WeekDay::THU(str) = week_days {
    println!(" {}", str);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值