《Rust权威指南》学习笔记之第6章 枚举与模式匹配
定义枚举
枚举变体(variant),声明枚举需要列举出来的所有可能的指。
enum IpAddrKind {
V4,
V6,
}
枚举值
let four = IpAddrKind::V4;
fn route(ip_type: IpAddrKind) { }
route(IpAddrKind::V4);
route(IpAddrKind::V6);
结构体中使用枚举。
enum IpAddrKind {
V4,
V6,
}
struct IpAddr {
kind: IpAddrKind,
address: String,
}
let home = IpAddr {
kind: IpAddrKind::V4,
address: String::from("127.0.0.1")
}
let loopback = IpAddr {
kind: IpAddrKind::V6,
address: String::from("::1")
}
枚举允许直接将关联的数据嵌入枚举变体内,每个变体可以拥有不同类型和数量的管理数据。
enum IpAddrKind {
V4(String),
V6(String),
}
let home = IpAddrKind::V4(String::from("127.0.0.1"));
let loopback = IpAddrKind::V4(String::from("::1"));
enum IpAddrKind {
V4(u8, u8, u8, u8),
V6(String),
}
let home = IpAddrKind::V4(127, 0, 0, 1);
let loopback = IpAddrKind::V4(String::from("::1"));
标准库设计IpAddr。
struct Ipv4Addr {
}
struct Ipv6Addr {
}
enum IpAddrKind {
V4(Ipv4Addr),
V6(Ipv6Addr),
}
内嵌不同数据类型的枚举变体。
enum Message {
Quit, //无关联数据
Move{x: i32, y:i32}, //匿名结构体
Write(String), //String
ChangeColor(i32, i32, i32), //3个i32
}
//对应结构体定义
struct QuitMessage;
struct MoveMessage {
x: i32,
y: i32,
};
struct WriteMessage(String);
struct ChangeColorMessage(i32, i32, i32);
枚举方法。
impl Message {
fn call(&self) {
}
}
let m = Message::Write(String::from("hello"));
m.call();
Option枚举及其处理空值
空值(Null)本身是一个值,含义却是没有值,代表因某种原因而变为无效或缺失的值。
标准库定义。
enum Option<T> {
Some(T),
None,
}
Option使用。
let some_number = Some(5);
let some_string = Some("a string");
let absent_number: Option<i32> = None;
Option错误使用。
let x: i8 = 5;
let y: Option<i8> = Some(5);
let sum = x + y;
控制流运算符match
值与模式比较,根据匹配模式执行代码。模式由字面量、变量名、通配符和其他东西组成。
enum Coin {
Penny,
Nickel,
Dime,
Quarter,
}
fn value_in_cents(coin: Coin) -> u32 {
match coin {
Coin::Penny => {
println!("Lucky penny!");
1
},
Coin::Nickel => 5,
Coin::Dime => 10,
Coin::Quarter => 25,
}
}
绑定值模式
匹配分支可以绑定被匹配对象的部分值,用于从枚举变体中提取值。
#[derive(Debug)]
enum UsState {
Alabama,
Alaska,
}
enum Coin {
Penny,
Nickel,
Dime,
Quarter(UsState),
}
fn value_in_cents(coin: Coin) -> u32 {
match coin {
Coin::Penny => {
println!("Lucky penny!");
1
},
Coin::Nickel => 5,
Coin::Dime => 10,
Coin::Quarter(state) => {
println!("State quarter from {:?}!", state);
25
},
}
}
匹配Option
fn plus_one(x: Option<i32>) -> Option<i32> {
match x {
None => None,
Some(i) => Some(i+1),
}
}
let five = Some(5);
let six = plus_one(five);
let onne = plus_one(None);
匹配必须穷举所有可能
漏掉None
fn plus_one(x: Option<i32>) -> Option<i32> {
match x {
Some(i) => Some(i+1),
}
}
通配符_
模式_匹配任何值
let some_u8_value = 0u8;
match some_u8_value {
1 => println!("one"),
3 => println!("three"),
5 => println!("five"),
7 => println!("seven"),
_ => (),
}
简单控制流if let
处理那些只用关心某一种匹配而忽略其他匹配的情况。
let some_u8_value = Some(0u8);
match some_u8_value {
Some(3) => println!("three"),
_ => (),
}
if let Some(3) = some_u8_value {
println!("three");
}
if let搭配else
let mut count = 0;
match coin {
Coin::Quarter(state) => println!("State quarter from {:?}!", state),
_ => count += 1,
}
if let Coin::Quarter(state) = coin {
println!("State quarter from {:?}!", state);
} else {
count += 1;
}