Trait std::convert::AsRef
Trait std::convert::AsMut
枚举和模式匹配:
定义枚举
枚举值
可以将任意类型的数据放入枚举成员中:例如字符串、数字类型或者结构体。甚至可以包含另一个枚举!另外,标准库中的类型通常并不比你设想出来的要复杂多少。
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
这个枚举有四个含有不同类型的成员:
- Quit 没有关联任何数据。
- Move 包含一个匿名结构体。
- Write 包含单独一个 String。
- ChangeColor 包含三个 i32。
枚举中也可以定义方法
option枚举
rust中没有空值
- 空值是一个因为某种原因目前无效或缺失的值。
enum Option<T> {
Some(T),
None,
}
match 控制流运算符
match本身也是个表达式,Rust就是基于表达式的语言。
enum Coin {
Penny,
Nickel,
Dime,
Quarter,
}
fn value_in_cents(coin: Coin) -> u8 {
match coin {
Coin::Penny => 1,
Coin::Nickel => 5,
Coin::Dime => 10,
Coin::Quarter => 25,
}
}
- 匹配Option
- Rust 中的匹配是 穷尽的(exhaustive)
_ 通配符
let some_u8_value = 0u8;
match some_u8_value {
1 => println!("one"),
3 => println!("three"),
5 => println!("five"),
7 => println!("seven"),
_ => (),
}
_ 将会匹配所有之前没有指定的可能的值。() 就是 unit 值,所以 _ 的情况什么也不会发生。因此,可以说我们想要对 _ 通配符之前没有列出的所有可能的值不做任何处理。
if let 简单控制流
let mut count = 0;
if let Coin::Quarter(state) = coin {
println!("State quarter from {:?}!", state);
} else {
count += 1;
}
匹配模式的全部语法
-
匹配字面值- 匹配命名变量
-
多个模式 在 match 表达式中,可以使用 | 语法匹配多个模式,它代表 或(or)的意思。
-
通过 …= 匹配值的范围 如果 x 是 1、2、3、4 或 5,第一个分支就会匹配。这相比使用 | 运算符表达相同的意思更为方便;相比 1…=5,使用 | 则不得不指定 1 | 2 | 3 | 4 | 5。相反指定范围就简短的多,特别是在希望匹配比如从 1 到 1000 的数字的时候!
-
解构并分解值
-
- 解构结构体
-
- 解构枚举
Result 与可恢复的错误
匹配不同的错误
失败时 panic 的简写:unwrap 和 expect
传播错误
当编写一个其实现会调用一些可能会失败的操作的函数时,除了在这个函数中处理错误外,还可以选择让调用者知道这个错误并决定该如何处理。这被称为 传播(propagating)错误,