【Rust自学】6.4. 简单的控制流-if let
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)
6.4.1. 什么是if let
if let
语法允许将if
和let
组合成一种不太冗长的方式来处理与一种模式匹配的值,同时忽略其余模式。
可以把if let
看作是match
的语法糖,也就是只针对某一种特定的模式来允许代码。
6.4.2. if let的应用
举个例子:v
是一个u8
类型的变量,判断v
是否是0,是0就打印zero
use rand::Rng; // 使用外部库
fn main(){ let v: u8 = rand::thread_rng().gen_range(0..=255); // 生成随机数println!("{}", v); match v { 0 => println!("zero"), _ => (), }
}
这里只用分辨0和非0两种情况,在这种情况下使用if let
就会更简单:
fn main(){ let v: u8 = rand::thread_rng().gen_range(0..=255); // 生成随机数 println!("{}", v); if let 0 = v { println!("zero"); };
}
注意:if let
用的是=
而不是==
小改一下上面的例子:v
是一个u8
类型的变量,判断v
是否是0,是0就打印zero,不是就打印not zero
use rand::Rng; // 使用外部库
fn main(){ let v: u8 = rand::thread_rng().gen_range(0..=255); // 生成随机数println!("{}", v); match v { 0 => println!("zero"), _ => println!("not zero"), }
}
这种情况下只需要给if let
加上else
就行:
fn main(){ let v: u8 = rand::thread_rng().gen_range(0..=255); // 生成随机数 println!("{}", v); if let 0 = v { println!("zero"); } else {println!("not zero");}
}
6.4.3. 使用if let的取舍
if let
相比match
有更少的代码,更少的缩进和更少的模版代码。但if let
放弃了穷举的可能。
所以说使用if let
还是match
需要根据实际需求来决定,这之间存在简洁性与穷尽性的取舍问题。
6.4.5. if let 与 if 的区别
很多初学者搞不清if let
与if
的区别,因为好像if let
能做的if
也能做,但它们两个有本质上的区别:if let
是模式匹配,if
是判断语句。
if
后面的条件只能是布尔类型,而if else
是匹配是否符合某个具体的模式,适合从枚举、Option
、Result
或其他支持模式匹配的类型中提取值。
如例:
fn main(){let x = Some(5);if let Some(value) = x {println!("Found a value: {}", value);} else {println!("No value found");}
}
if
就做不到解包Option
,想要实现这样的效果就只能使用模式匹配(match
和if let
)。