Rust のアンラップとその使用方法

Nilesh Katuwal 2022年6月7日
Rust のアンラップとその使用方法

この記事では、unwrap と Rust でのその使用法について説明します。

Rust における unwrap について

Rust では、何かを unwrap するということは、次のコマンドを発行することを意味します。計算の結果を教えてください。エラーが発生した場合は、パニックになってプログラムを停止してください。アンラッピングは非常に単純なプロセスであるため、そのコードを示すことは有益です。

ただし、その前に、Option タイプと Result タイプを調査する必要があります。

Option タイプ

Option タイプは、Rust のタイプシステムを使用して欠席の可能性を表現する方法です。欠席の可能性を型システムにエンコードすることは、コンパイラーに欠席の処理をプログラマーに強制するため、非常に重要です。

不在の可能性がある場合は、std ライブラリの Option<T> という名前の enum が使用されます。これは、2つの Option のいずれかの形式を取ります。

  1. Some(T) - タイプ T の要素が識別されました。
  2. None - 要素が検出されませんでした。

これらの状況は、match を明示的または暗黙的に unwrap を使用して処理できます。暗黙的な処理は、内部要素または panic のいずれかを返します。

構文:

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

panicexpect を使用して手動でカスタマイズできますが、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),
}