rust 枚举
# 枚举声明/使用
// 声明/创建
enum IpAddr {
V4,
V6
}
//使用
let addr = IpAddr::V4;
let addr = IpAddr::V6;
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 枚举允许将数据附加到枚举值中
- 不需要额外的struct来关联
- 每个枚举值都可以是不同的类型
// 声明/创建
enum IpAddr {
V4(u8, u8, u8, u8),
V6(String)
}
// 使用
let addr = IpAddr::V4(127, 0, 0, 1);
let addr = IpAddr::V6(String::from("::8080"));
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 给枚举定义方法
// 声明/创建
enum IpAddr {
V4(u8, u8, u8, u8),
V6(String)
}
impl IpAddr {
fn call(&self) {
println!("call method run")
}
}
// 使用
let addr = IpAddr::V6(String::from("::8080"));
addr.call();
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# Option枚举
用于描述一个值是否存在,存在则是 Some(t) ,不存在则为 None 。
rust没有Null或Undefined,但是保留了Null的概念:因为某种原因变为无效或缺失的值。Option枚举就是为了解决这个问题的,有值的时候返回Some(t) ,否则返回None 。
这样的好处在于,当要使用 Option<T> 的值时,必须要将T取出来使用,这个取值的过程中相当于做了一次检查,检查了是否存在值,为Some(t) 就把值获取出来使用,为None 就做其他处理。
Option在标准库中的定义
pub enum Option<T> { /// No value. #[lang = "None"] #[stable(feature = "rust1", since = "1.0.0")] None, /// Some value of type `T`. #[lang = "Some"] #[stable(feature = "rust1", since = "1.0.0")] Some(#[stable(feature = "rust1", since = "1.0.0")] T), }1
2
3
4
5
6
7
8
9
10简单使用
当一个变量的值为
None时需要明确的指定这个变量的类型,因为编译器无法推断出值为None的变量的类型let f = Some("test"); let f2: Option<i32> = None;1
2
# 枚举与match模式匹配
enum Coin {
Penny,
Nickel,
Dime,
Quarter
}
fn value_in_cents(coin: &Coin) -> u8 {
match coin {
Coin::Dime => 10,
Coin::Nickel => 5,
Coin::Penny => 1,
Coin::Quarter => 25
}
}
println!("coin: {}", value_in_cents(&Coin::Quarter)); // coin: 25
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 通过match获取绑定值的枚举项
- match匹配必须穷举全部可能性
- 如果不想处理所有的可能性时,使用_通配符统一处理剩余可能性
_ => println!("其他可能性")。_通配符需要放在最后。
获取到Quarter枚举项所绑定的值
提示
因为获取到的值是个引用类型,所以需要使用*解引用后返回
enum Coin {
Penny,
Nickel,
Dime,
Quarter(u8)
}
fn value_in_cents(coin: &Coin) -> u8 {
match coin {
Coin::Dime => 10,
Coin::Nickel => 5,
Coin::Penny => 1,
Coin::Quarter(state) => *state
}
}
println!("coin: {}", value_in_cents(&Coin::Quarter(66))); // coin: 66
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Option 枚举
fn handle_add(params: &Option<i32>) -> Option<i32> {
match params {
None => {
println!("值为 none");
None
},
Some(data) => Some(data + 1)
}
}
let n = Some(5);
let n2: Option<i32> = None;
println!("n1: {:?}, n2: {:?}", handle_add(&n), handle_add(&n2)); // n1: Some(6), n2: None
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# if let 使用
if let作用和match很像,但if let 比较适合处理简单的模式匹配处理,比如只想处理某一种模式的时候可以使用,也可以搭配else和else if使用
可以看做match的语法糖
fn handle_add(params: &Option<i32>) -> Option<i32> {
if let Some(data) = params {
return Some(data + 1)
}
*params
}
let n = Some(5);
let n2: Option<i32> = None;
println!("n1: {:?}, n2: {:?}", handle_add(&n), handle_add(&n2)); // n1: Some(6), n2: None
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
编辑 (opens new window)
上次更新: 2024/01/15, 02:08:26