W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
ch06-03-if-let.md
commit 40c98a5118d2ba93ce9fd39c313bcbce5597818d
if let
語法讓我們以一種不那么冗長的方式結合 if
和 let
,來處理只匹配一個模式的值而忽略其他模式的情況??紤]示例 6-6 中的程序,它匹配一個 config_max
變量中的 Option<u8>
值并只希望當值為 Some
成員時執(zhí)行代碼:
let config_max = Some(3u8);
match config_max {
Some(max) => println!("The maximum is configured to be {}", max),
_ => (),
}
示例 6-6:match
只關心當值為 Some
時執(zhí)行代碼
如果值是 Some
,我們希望打印出 Some
成員中的值,這個值被綁定到模式中的 max
變量里。對于 None
值我們不希望做任何操作。為了滿足 match
表達式(窮盡性)的要求,必須在處理完這唯一的成員后加上 _ => ()
,這樣也要增加很多煩人的樣板代碼。
不過我們可以使用 if let
這種更短的方式編寫。如下代碼與示例 6-6 中的 match
行為一致:
let config_max = Some(3u8);
if let Some(max) = config_max {
println!("The maximum is configured to be {}", max);
}
if let
語法獲取通過等號分隔的一個模式和一個表達式。它的工作方式與 match
相同,這里的表達式對應 match
而模式則對應第一個分支。在這個例子中,模式是 Some(max)
,max
綁定為 Some
中的值。接著可以在 if let
代碼塊中使用 max
了,就跟在對應的 match
分支中一樣。模式不匹配時 if let
塊中的代碼不會執(zhí)行。
使用 if let
意味著編寫更少代碼,更少的縮進和更少的樣板代碼。然而,這樣會失去 match
強制要求的窮盡性檢查。match
和 if let
之間的選擇依賴特定的環(huán)境以及增加簡潔度和失去窮盡性檢查的權衡取舍。
換句話說,可以認為 if let
是 match
的一個語法糖,它當值匹配某一模式時執(zhí)行代碼而忽略所有其他值。
可以在 if let
中包含一個 else
。else
塊中的代碼與 match
表達式中的 _
分支塊中的代碼相同,這樣的 match
表達式就等同于 if let
和 else
?;貞浺幌率纠?6-4 中 Coin
枚舉的定義,其 Quarter
成員也包含一個 UsState
值。如果想要計數(shù)所有不是 25 美分的硬幣的同時也報告 25 美分硬幣所屬的州,可以使用這樣一個 match
表達式:
let mut count = 0;
match coin {
Coin::Quarter(state) => println!("State quarter from {:?}!", state),
_ => count += 1,
}
或者可以使用這樣的 if let
和 else
表達式:
let mut count = 0;
if let Coin::Quarter(state) = coin {
println!("State quarter from {:?}!", state);
} else {
count += 1;
}
如果你的程序遇到一個使用 match
表達起來過于啰嗦的邏輯,記住 if let
也在你的 Rust 工具箱中。
現(xiàn)在我們涉及到了如何使用枚舉來創(chuàng)建有一系列可列舉值的自定義類型。我們也展示了標準庫的 Option<T>
類型是如何幫助你利用類型系統(tǒng)來避免出錯的。當枚舉值包含數(shù)據(jù)時,你可以根據(jù)需要處理多少情況來選擇使用 match
或 if let
來獲取并使用這些值。
你的 Rust 程序現(xiàn)在能夠使用結構體和枚舉在自己的作用域內(nèi)表現(xiàn)其內(nèi)容了。在你的 API 中使用自定義類型保證了類型安全:編譯器會確保你的函數(shù)只會得到它期望的類型的值。
為了向你的用戶提供一個組織良好的 API,它使用起來很直觀并且只向用戶暴露他們確實需要的部分,那么現(xiàn)在就讓我們轉(zhuǎn)向 Rust 的模塊系統(tǒng)吧。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: