定义枚举
- IP地址:IPv4、IPv6
enum IpAddrKindf {
V4,
V6
}
枚举值
- let four =lpAddrKind::V4;
- let six = lpAddrKind::V6;
将数据附加到枚举的变体中
- 优点:
- 不需要额外使用 struct
- 每个变体可以拥有不同的类型以及关联的数据量
enum IpAddrKindf {
V4(u8,u8,u8,u8),
V6(String)
}
为枚举定义方法
- 也使用impl关键字
Option 枚举
- 定义于标准库中
- 在 Prelude(预导入模块)中
- 描述了:某个值可能存在(某种类型) 或不存在的情况
Rust 没有 Null
- 其它语言中:
- Null 是一个值,它表示“没有值”
- 一个变量可以处于两种状态: 空值 (null)、非空
- Null 引用: Billion Dollar Mistake
- Null 的问题在于:当你尝试像使用非 Null 值那样使用 Nul 值的时候,就会引起某种错误
- Null的概念还是有用的:因某种原因而变为无效或缺失的值
Rust 中类似 Null 概念的枚举 - Option
- 标准库中的定义:
enum Option<T> {
Some(T),
None
}
- 它包含在 Prelude (预导入模块) 中。可直接使用:
- Option
- Some(T)
- None
- Option
fn main() {
let some_number=Some(5);
let some_string=Some("A String");
let absernt_number:Option<32>=None;
}
Option 比 Null 好在哪?
- Option
和T是不同的类型,不可以把 Option 直接当成T - 若想使用 Option
中的 T,必须将它转换为 T - 而在C# 中:
- string a = null;
- string b=a +“12345”
控制流运算符 match
- 允许一个值与一系列模式进行匹配,并执行匹配的模式对应的代码
- 模式可以是字面值、变量名、通配符...
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
}
}
绑定值的模式
- 匹配的分支可以绑定到被匹配对象的部分值。
- 因此,可以从 enum 变体中提取值
enum UsState {
Alabama,
Alaska
}
enum Coin {
Quarter(UsState)
}
fn value_in_cents(coin:Coin)->u8 {
match coin {
Coin::Quarter(UsState)=>{
}
}
}
匹配Option
fn plus_one(x:Option<i32>)->Option<i32> {
match x {
None=>None,
Some(i)=>Some(i+1)
}
}
match 匹配必须穷举所有的可能
- _通配符:替代其余没列出的值
fn plus_one(x:Option<i32>)->Option<i32> {
match x {
None=>None,
_ =>()
}
}
if let
- 处理只关心一种匹配而忽略其它匹配的情况
let v=Some(0u8);
if let Some(3) = v {
println!("three");
}
- 更少的代码,更少的缩进,更少的模板代码
- 放弃了穷举的可能
- 可以把iflet 看作是 match 的语法糖
- 搭配 else
let v=Some(0u8);
if let Some(3) = v {
println!("three");
}else {
println!("others");
}
标签:Null,06,Option,Some,枚举,let,Coin,模式匹配
From: https://www.cnblogs.com/huiteresa/p/16930373.html