喜歡的話別忘了點贊、收藏加關注哦,對接下來的教程有興趣的可以關注專欄。謝謝喵!(=・ω・=)
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
)。