RUST学习-枚举

枚举在rust语言里是一个很强大的数据结构

定义枚举

和strut很类似,关键字是enum,同时我们也能为枚举里每个值增加不同的成员,和方法,见下面的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
enum IpAddrKind {
V4(u8, u8, u8, u8),//ipv4是4个0-255的数字
V6(String),//ipv6是一个字符串
}

impl IpAddrKind {
fn call(&self) {} //枚举的方法
}

//调用方法见下面
fn main() {
let ip_v4 = IpAddrKind::V4(127, 0, 0, 1);
let ip_v6 = IpAddrKind::V6(String::from("::1"));
ip_v4.call();
ip_v6.call();
}

match和if let

rust类似于其他编程语言开关语句(switch–case)的语法结构是match,/match必须穷举所有可能性,如果值关注几个分支,则需要_通配符,即 _ => (),

如果只助理一个分支则可以用if let,见下面,这种方式写的代码更少,缩进更少,也使用更少末班,使用if let放弃了穷举的可能,和match相比是简洁和穷尽的取舍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
fn main() {
let v = 0u8;
match v {
0 => { println!(" zero"); }
1 => { println!(" one"); }
2 => { println!(" two"); }
_ => (),//忽略其他 类似switch
}

/*
在这个例子plus_one对Option枚举里的值+1并且返回,有俩个分支一个None一个是Some,这里我们输出非None,这里可以搭配else使用
*/
let result = plus_one(Some(5));
if let Some(v) = result {
println!("plus_one :{}", v);
}else{
println!("plus_one other");
}
/*
这里我们想输出None这种分支
*/
let result = plus_one(None);
if let None = result {
println!("plus_one NONE");
}
}

如何访问枚举的成员

可以用上面的if let和match

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//用Match访问成员变量
fn vlue_in_cents(coin: Coin) -> u32 {
match coin {
Coin::Penny => {
println!("{}", 1);
return 1;
}
Coin::Nickel => {
println!("{}", 5);
return 5;
}
Coin::Dime => {
println!("{}", 10);
return 10;
}
Coin::Quarter(State) => {
println!("Quarter from State:{:?}", State);
return 25;
}
}
}

fn main() {
//if let访问成员变量
let result = plus_one(Some(5));
if let Some(v) = result {
println!("plus_one :{}", v);
}else{
println!("plus_one other");
}

//vlue_in_cents函数如何访问State成员
println!("Coin result {}", vlue_in_cents(Coin::Quarter(State::Alabama)));
}

Option枚举

Option枚举是很特殊的一个枚举类型,他包含Some和None俩个值,其中None是用来处理null这种情况的,因为RUST里没有NULL。

见下面的plus_one函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
fn plus_one(input: Option<i32>) -> Option<i32> {
match input {
None => None,
Some(v) => Some(v + 1),
}
}

fn main() {
//如果只助理一个分支则可以用if let,见下面,这种方式写的代码更少,缩进更少,也使用更少末班,使用if let放弃了穷举的可能,和match相比是简洁和穷尽的取舍
/*
在这个例子plus_one对Option枚举里的值+1并且返回,有俩个分支一个None一个是Some,这里我们输出非None,这里可以搭配else使用
*/
let result = plus_one(Some(5));
if let Some(v) = result {
println!("plus_one :{}", v);
}else{
println!("plus_one other");
}
/*
这里我们想输出None这种分支
*/
let result = plus_one(None);
if let None = result {
println!("plus_one NONE");
}
}