Rust if let 簡潔控制流

2023-03-22 15:09 更新
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)吧。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號