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 enum を使用することで実現できます。

Option<T> enum には 2 つのバリアントがあります。

  • None。失敗または値がないことを示します。
  • Some(value)。型 Tvalue をラップするタプル構造体です。
// `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` 値は、他の enum と同様にパターンマッチできます
    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` バリアントを unwrap すると、ラップされた値が取り出されます。
    println!("{:?} unwraps to {:?}", optional_float, optional_float.unwrap());

    // `None` バリアントを unwrap すると `panic!` します
    println!("{:?} unwraps to {:?}", none, none.unwrap());
}