Rust Option::unwrap() 完全解説【初心者向け】

そもそも Option って何?

Rustには「値があるかもしれないし、ないかもしれない」という状況を表す Option 型があります。

enum Option<T> {
    Some(T),  // 値がある場合
    None,     // 値がない場合
}

具体例で考える

例えば、配列から要素を取得するとき:

let numbers = [1, 2, 3];
 
// インデックス0の要素を取得 → Some(1) が返る
let first = numbers.get(0);  // Some(1)
 
// インデックス100の要素を取得 → 存在しないので None が返る
let out_of_bounds = numbers.get(100);  // None

他の言語では「存在しない」場合に nullundefined が返ってきて、それを忘れるとバグになります。Rustは Option を使うことで「値がないかもしれない」ことを型レベルで強制的に意識させるのです。


unwrap() とは?

unwrap() は、Option から中身の値を強制的に取り出すメソッドです。

シグネチャ(関数の定義)

pub const fn unwrap(self) -> T
  • 引数: selfOption<T> 自身)
  • 戻り値: T(中身の値)

動作

Optionの状態unwrap() の動作
Some(値)中身の値を返す
Noneパニック!(プログラムがクラッシュ)

使用例

成功するケース

let x = Some("air");
assert_eq!(x.unwrap(), "air");  // ✅ "air" が取り出せる

失敗するケース(パニック)

let x: Option<&str> = None;
x.unwrap();  // ❌ パニック!プログラムがクラッシュする

⚠️ 注意:unwrap() の使用は推奨されない

公式ドキュメントでは、unwrap() の使用は一般的に非推奨とされています。

なぜ?

  • パニックは回復不能なエラーを意味する
  • プログラム全体が強制終了する可能性がある
  • プロダクションコードでは避けるべき

代替手段(こっちを使おう!)

1. パターンマッチング

None の場合を明示的に処理できる:

let x: Option<i32> = Some(42);
 
match x {
    Some(value) => println!("値は: {}", value),
    None => println!("値がありません"),
}

2. unwrap_or() — デフォルト値を指定

None の場合に返すデフォルト値を指定できる:

let x = Some("car");
let y: Option<&str> = None;
 
assert_eq!(x.unwrap_or("bike"), "car");   // Some → 中身を返す
assert_eq!(y.unwrap_or("bike"), "bike");  // None → デフォルト値を返す

3. unwrap_or_else() — クロージャで計算

None の場合に実行する処理を指定できる(遅延評価):

let k = 10;
 
assert_eq!(Some(4).unwrap_or_else(|| 2 * k), 4);   // Some → 中身を返す
assert_eq!(None.unwrap_or_else(|| 2 * k), 20);    // None → クロージャを実行

4. unwrap_or_default() — 型のデフォルト値を使用

None の場合に、その型のデフォルト値を返す:

let x: Option<i32> = None;
assert_eq!(x.unwrap_or_default(), 0);  // i32のデフォルトは0

5. ? 演算子(関数内で使用)

Option を返す関数内で、None の場合に早期リターンできる:

fn get_first_char(s: &str) -> Option<char> {
    let first = s.chars().next()?;  // Noneならここで関数を抜ける
    Some(first)
}

expect() — エラーメッセージ付き unwrap()

unwrap() の兄弟メソッド。パニック時にカスタムメッセージを表示できる:

let x = Some("value");
assert_eq!(x.expect("値が必要です"), "value");  // ✅ OK
 
let y: Option<&str> = None;
y.expect("値が必要です");  // ❌ パニック!メッセージ「値が必要です」が表示される

推奨されるメッセージのスタイル

「〜であるべき」という理由を書く:

let item = slice.get(0)
    .expect("スライスは空であってはならない");

まとめ

メソッドNoneの時の動作使いどころ
unwrap()パニックテストやプロトタイプのみ
expect("msg")メッセージ付きパニックデバッグ時
unwrap_or(default)デフォルト値を返す固定のフォールバック値がある時
unwrap_or_else(f)クロージャを実行計算が必要なフォールバック
unwrap_or_default()型のデフォルト値Defaultトレイト実装型
パターンマッチ自由に処理最も安全で柔軟
? 演算子早期リターン関数内での伝播

結論

unwrap() は「絶対に None にならない」と確信できる時のみ使う

初心者のうちは unwrap() を避けて、matchunwrap_or() を使う習慣をつけましょう。そうすることで、予期しないクラッシュを防ぎ、より堅牢なコードを書けるようになります。


参考リンク