Option 枚举值特殊语法
let Some(num) = value
在if
或者while
条件语句中,只要当前的条件是 Some,那么判断为 true。
在 if let 语法
中使用
if let 语法可以认为是只区分两种情况的 match 语句的"语法糖",可以在之后添加一个 else 块来处理例外情况。
if let 匹配值 = 源变量 {
语句块
}
// 示例
let i = 0;
if let 0 = i {
println!("zero");
}
// 对枚举依然适用
fn main() {
enum Book {
Papery(u32),
Electronic(String)
}
let book = Book::Electronic(String::from("url"));
if let Book::Papery(index) = book {
println!("Papery {}", index);
} else {
println!("Not papery book");
}
}
let value: Option<i32> = Some(12);
if let Some(num) = value {
println!("有效值:{}", num)
} else {
println!("无效值:None")
}
// 输出:有效值:12
解释:首先声明了一个 value 变量,同时分配了一个枚举值Some(12),接下来在 if 语句中使用let Some(num) = value
,如果 value 是一个 Some 枚举值就会把该枚举值包裹的数据取出来赋值给变量num
进去第一个分支语句块中,如果 value 是一个 None 类型枚举值,就会进入 else 分支语句块中。
// ------- 示例 1 -------
let value: Option<i32> = None;
if let None = value {
println!("is None")
} else {
println!("not None")
}
// 输出:is None
// ------- 示例 2 -------
enum Day {
firtst,
second,
}
let c = Day::firtst;
if let Day::firtst = c {
println!("枚举值相等")
}
// 输出:枚举值相等
// ------- 示例 3 -------
let d = 12;
let txt = if let 12 = d {
"等于12"
} else {
"不等于12"
};
println!("txt: {}", txt);
// 输出:txt: 等于12
if let
语句的表达式部分在等号两端数据类型要一致,比如都是 Optional 或者 Result 的类型,或者都是枚举、i32 等类型。但是对于非枚举值使用 if let 显得不合适。
在 while
中使用
fn main() {
let mut iter = (1..5).into_iter();
// 这里 next() 方法返回 Option 枚举类型的值
while let Some(val) = iter.next() {
println!("val: {}", val);
}
}
在 match
中使用
fn main() {
let v = Some(3);
match v {
Some(a) => println!("value: {}", a),
// match 分支中最后一条使用 _ 表示除了上面的可能性外都进入该分支
// 类似于 if/else 中的 else 语句
_=>(),
}
}
在 match 分支中匹配确定的值
fn main() {
let v = Some(3);
let c= match v {
// Some(a) => a,
Some(2) => 12,
Some(3) => 13,
_ => 0
};
println!("c = {}", c);
// 输出:13
}
if let
& match
支持同时匹配多个条件,使用 | 分割
// match 语句
fn main() {
let v = Some(2);
let c= match v {
Some(2) | Some(3) => 18,
_ => 0
};
println!("c = {}", c);
// 输出:c = 18
}
// if let 语句
fn main() {
let v = Some(2);
let c = if let Some(2) | Some(3) = v {
18
} else {
0
};
println!("c = {}", c);
// 输出:c = 18
}