Option - Rust By Example
Description: Rust by Example (RBE) is a collection of runnable examples that illustrate various Rust concepts and standard libraries.

## 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

# `Option`

プログラムの一部が失敗した際、`panic!`するよりも、エラーを捕捉する方が望ましい場合があります。これは`Option`という列挙型を用いることで可能になります。

列挙型`Option<T>`には2つの値があります。

- `None`、これは実行の失敗か値の欠如を示します。
- `Some(value)`、型`T`の`value`をラップするタプルです。

    // `panic!`を起こさない整数の割り算
    fn checked_division(dividend: i32, divisor: i32) -> Option<i32> {
        if divisor == 0 {
            // 失敗は`None`としてあらわされます。
            None
        } else {
            // 結果は`Some`にラップされます。
            Some(dividend / divisor)
        }
    }

    // この関数は失敗する割り算を扱うことができます。
    fn try_division(dividend: i32, divisor: i32) {
        // `Option` の値は、他のあらゆる列挙型と同様パターンマッチに使用できます。
        match checked_division(dividend, divisor) {
            None => println!("{} / {} failed!", dividend, divisor),
            Some(quotient) => {
                println!("{} / {} = {}", dividend, divisor, quotient)
            },
        }
    }

    fn main() {
        try_division(4, 2);
        try_division(1, 0);

        // `None`を変数に代入する際は、型を明示しなくてはなりません。
        let none: Option<i32> = None;
        let _equivalent_none = None::<i32>;

        let optional_float = Some(0f32);

        // `Some`をアンラップすると中の値を取得できます。
        println!("{:?} unwraps to {:?}", optional_float, optional_float.unwrap());

        // `None`をアンラップしようとすると`panic!`します。
        println!("{:?} unwraps to {:?}", none, none.unwrap());
    }