枚举的声明类似于结构体,不同的是,在一个枚举类型的变量中,其值类型为所有字段类型之一。结构体中可以嵌套枚举类型,实现复杂的数据结构。
枚举的定义及使用如下:
enum IpAddr {
V4(u8,u8,u8,u8),
V6(String),
}
let home = IpAddr::V4(17,0,0,1);
let loopback = IpAddr::V6(String::from("::1"));
类似于结构体,也可以为枚举类型实现方法,可以通过枚举类型变量进行调用。
Option 是rust标准库定义的枚举类型,定义如下:
enum Option<T> {
None,
Some(T),
}
其中T为泛型,标准库如此定义是为了增加代码的兼容性。
Option的使用如下:
let some_number = Some(5);
let some_char = Some('e');
let absent_number : Option<i32> = None;
值得注意的是,rust对Option进行了优化,使用rust声明变量时可以省略Option::前缀。但将变量赋值为None时,需要指定其类型。
此外,Option<T>类型与T类型不能直接进行运算,需要提前进行类型转换。如:
Option<i8>不能直接与i8类型的数字进行运算。
功能类似于其他语言中的swith语句,match能够处理多分支的情况。用法如下:
enum Coin {
Penny,
Nickel,
Dime,
Quarter(UsState),
}
enum UsState {
Albama,
Alaska,
}
fn value_in_cents(coin: Coin) -> u8 {
match coin {
Coin::Penn => {
println!("hello world!!!");
1
},
Coin::Nickel => 5,
Coin::Dime => 10,
Coin::Quarter(state) => {
println!("state is {:?}",state);
35
},
}
}
'->'前为对应的模式,指定值与该模式匹配后将执行相应的表达式或代码块,模式中也可以绑定值,如代码19-22行所示。'->'后可跟一个表达式或大括号包围的代码块。值得注意的是,代码块必须有返回值,表达式或代码块的返回值将作为match的返回值。
此外,match必须覆盖所有可能的模式,可以使用other或者_来表示默认匹配的模式。
可以用if-let或if-let-else语句来替代分支较少的match
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。