Unwrap 及其在 Rust 中的使用

Nilesh Katuwal 2022年6月7日
Unwrap 及其在 Rust 中的使用

本文將介紹 unwrap 及其在 Rust 中的使用。

Rust 中的 unwrap

在 Rust 中,unwrap 意味著發出以下命令:給我計算結果,如果有錯誤,恐慌並停止程式。因為解包是一個非常簡單的過程,所以演示它的程式碼對我們是有益的。

但是,我們需要先調查 OptionResult 型別,然後才能執行此操作。

Option 型別

Option 型別是一種使用 Rust 型別系統表達缺席可能性的方法。將缺席的可能性編碼到型別系統中是至關重要的,因為它迫使編譯器強制程式設計師處理缺席。

如果可能不存在,則使用 std 庫中名為 Option<T>enum。它採用兩個選項之一的形式。

  1. Some(T) - 已識別型別 T 的元素。
  2. None - 未檢測到任何元素。

這些情況可以使用 match 顯式或隱含 unwrap 處理。隱式處理返回內部元素或 panics

語法:

enum Option<T> {
    None,
    Some(T),
}

查詢副檔名的示例:

fn find(haystack: &str, words: char) -> Option<usize> { haystack.find(words) }
fn main() {
    let name_of_file = "file.doc";
    match find(name_of_file, '.') {
        None => println!("Extension could not be found."),
        Some(i) => println!("The extension of file is: {}", &name_of_file[i+1..]),
    }
}

輸出:

The extension of file is: doc

請注意,panic 可以使用 expect 手動自定義,但 unwrap 產生的相關輸出少於顯式處理。在下面的示例中,顯式處理會產生更受控制的結果,同時在需要時保留 panic 選項。

fn adult_man(food: Option<&str>) {
    match food {
        Some("pasta") => println!("The food does not taste right."),
        Some(inner)   => println!("{}? It could be nice.", inner),
        None          => println!("No good food? Nevertheless."),
    }
}

fn food(food: Option<&str>) {
    let interior = food.unwrap();
    if interior == "pasta" { panic!("Ummmmmm!!!!"); }

    println!("I am glad to have {}s!!!!!", interior);
}

fn main() {
    let bruschetta  = Some("Bruschetta");
    let pasta = Some("pasta");
    let void  = None;

    adult_man(bruschetta);
    adult_man(pasta);
    adult_man(void);

    let spaghetti = Some("spaghetti");
    let nothing = None;

    food(spaghetti);
    food(nothing);
}

首先,在上述程式碼中,所有食物都使用 match 明確處理。

所有食物都使用 unwrap 作為部分功能隱式處理。Unwrap 在收到 none 時返回 panic

輸出:

Bruschetta? It could be nice.
The food does not taste right.
No good food? Nevertheless.
I am glad to have spaghettis!!!!!

Result 型別

ResultOption 的更強大的版本。與表示缺席可能性的 Option 不同,Result 表示錯誤的可能性。

該錯誤通常用於指示計算執行失敗的原因。這是單詞 Option 的一般形式。

語法:

enum Result<T, E> {
    Ok(T),
    Err(E),
}