Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
Option::unwrap() / expect() / unwrap_or()
『Option』から値を取り出すメソッド群です。『unwrap()』は最もシンプルですが、『None』の場合はパニックするため、代替値を指定できる『unwrap_or()』や、エラーメッセージを付けられる『expect()』を状況に応じて使い分けます。
構文
// Someなら値を返し、Noneならパニックします。
let value = option.unwrap();
// Noneの場合にエラーメッセージ付きでパニックします。
let value = option.expect("エラーメッセージ");
// Noneの場合にデフォルト値を返します。
let value = option.unwrap_or(デフォルト値);
// Noneの場合にクロージャでデフォルト値を生成します。
let value = option.unwrap_or_else(|| 計算式);
// Noneの場合にデフォルトトレイトの値を返します。
let value = option.unwrap_or_default();
メソッド一覧
| メソッド | 概要 |
|---|---|
| unwrap() | 『Some(x)』なら『x』を返します。『None』の場合はパニックします。値が必ず存在すると確信できる場面以外では使用を避けてください。 |
| expect("msg") | 『unwrap()』と同じですが、パニック時に指定したメッセージが表示されます。デバッグ時に原因の特定がしやすくなります。 |
| unwrap_or(val) | 『Some(x)』なら『x』を、『None』なら引数の『val』を返します。引数は常に評価されます。 |
| unwrap_or_else(fn) | 『None』のときだけクロージャを実行してデフォルト値を生成します。デフォルト値の計算コストが高い場合に有効です。 |
| unwrap_or_default() | 『None』のときに『Default』トレイトのデフォルト値(数値なら0、文字列なら空文字など)を返します。 |
サンプルコード
fn main() {
let some_val: Option<i32> = Some(42);
let none_val: Option<i32> = None;
// unwrap: Someのときは値を取り出します。
println!("{}", some_val.unwrap()); // 42
// expect: Noneのとき指定メッセージでパニックします。
println!("{}", some_val.expect("値が必要です。")); // 42
// unwrap_or: Noneのときデフォルト値を返します。
println!("{}", none_val.unwrap_or(0)); // 0
println!("{}", some_val.unwrap_or(0)); // 42
// unwrap_or_else: Noneのときだけクロージャが実行されます。
let result = none_val.unwrap_or_else(|| {
println!("クロージャ実行");
-1
});
println!("{}", result); // -1
// unwrap_or_default: i32のデフォルトは0です。
let default_val: i32 = none_val.unwrap_or_default();
println!("{}", default_val); // 0
// 文字列型のデフォルトは空文字列です。
let name: Option<String> = None;
println!("'{}'", name.unwrap_or_default()); // ''
}
概要
値を取り出すメソッドの使い分けは「Noneになりえるか」「デフォルト値が必要か」「デフォルト値の計算コストが高いか」で判断します。『unwrap()』はNoneのときに即座にパニックするため、本番コードでの使用は最小限にとどめてください。
デフォルト値が固定の場合は『unwrap_or()』、計算が必要な場合は『unwrap_or_else()』、型のデフォルト値でよい場合は『unwrap_or_default()』を使います。パニックを許容する場面では、原因特定しやすいよう『unwrap()』より『expect()』を使う習慣をつけると良いでしょう。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。