Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Optionunwrap

前回の例では、プログラムを意図的に失敗させられることを示しました。 砂糖入りレモネードを飲んだら panic するようにプログラムに指示しました。 では、何らかの 飲み物を期待しているのに受け取らなかった場合はどうでしょうか? その場合も同じくらい悪い状況なので、処理する必要があります!

レモネードの場合と同じように、空文字列("")と照合して調べることも_できます_。 Rust を使っているので、代わりに、飲み物がないケースをコンパイラに指摘してもらいましょう。

std ライブラリにある Option<T> という enum は、不在が 起こり得る場合に使われます。これは 2 つの「オプション」のいずれかとして現れます。

  • Some(T): 型 T の要素が見つかった
  • None: 要素が見つからなかった

これらのケースは、match によって明示的に処理することも、unwrap によって暗黙的に処理することもできます。 暗黙的な処理では、内部の要素を返すか、panic します。

expect を使えば panic を手動でカスタマイズできることに注意してください。 ただし、そうしない場合、unwrap は明示的な処理よりも意味の薄い出力になります。 次の例では、明示的な処理によって、必要に応じて panic する選択肢を残しつつ、 より制御された結果を得ています。

// 大人はすべてを見てきており、どんな飲み物でもうまく扱えます。
// すべての飲み物は `match` を使って明示的に処理されます。
fn give_adult(drink: Option<&str>) {
    // それぞれのケースに対する行動方針を指定します。
    match drink {
        Some("lemonade") => println!("うげっ!甘すぎる。"),
        Some(inner)   => println!("{}?いいですね。", inner),
        None          => println!("飲み物がない?まあいいでしょう。"),
    }
}

// 他の人は、砂糖入り飲料を飲む前に `panic` します。
// すべての飲み物は `unwrap` を使って暗黙的に処理されます。
fn drink(drink: Option<&str>) {
    // `unwrap` は `None` を受け取ると `panic` を返します。
    let inside = drink.unwrap();
    if inside == "lemonade" { panic!("AAAaaaaa!!!!"); }

    println!("{}が大好きです!!!!!", inside);
}

fn main() {
    let water  = Some("water");
    let lemonade = Some("lemonade");
    let void  = None;

    give_adult(water);
    give_adult(lemonade);
    give_adult(void);

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

    drink(coffee);
    drink(nothing);
}