expect メソッド
CoddyのRustジャーニー「Logic & Flow」セクションの一部 — レッスン 39/66。
.unwrap() は目的を果たしますが、大きな欠点があります。None でパニックが発生した際、エラーメッセージが一般的で役に立たないという点です。そこで .expect() の出番です。
.expect()メソッドは、.unwrap()と全く同じように動作します。つまり、Someから値を取り出し、Noneの場合はパニック(panic)を発生させます。主な違いは、.expect()ではカスタムのパニックメッセージを指定できる点です:
let maybe_score = Some(95);
let score = maybe_score.expect("Score should always be present");
println!("Your score is: {}", score);Option が Some を含んでいる場合、.expect() は .unwrap() と同様に内部の値を返します。しかし、それが None の場合、一般的なパニックメッセージの代わりにカスタムメッセージが表示されるため、何がどこで問題になったのかをより簡単に理解できるようになります。
チャレンジ
簡単2つの入力を受け取ります。最初の入力は製品名で、2番目の入力はその製品の在庫があるか(yes)在庫切れか(no)を示します。製品の在庫がある場合は Some(product_name) を含み、在庫切れの場合は None を含む Option<String> を作成してください。.expect() を使用して、説明的なメッセージとともに製品名を取り出し、それを表示してください。
要件:
- 最初の入力(製品名)を読み込み、空白をトリミングします
- 2番目の入力(在庫状況)を読み込み、空白をトリミングします
Option<String>変数を作成します:- 在庫状況が
yesの場合、Some(product_name.to_string())を割り当てます - 在庫状況が
noの場合、Noneを割り当てます
- 在庫状況が
- メッセージ
"Product should be in stock"を指定した.expect()を使用して、製品名を取り出します - 取り出した製品名を次の形式で出力します:
Product available: [product_name]
入力:
- 1行目:製品名(例:
Laptop) - 2行目:
yesまたはno
出力:
- 在庫状況が
yesの場合:Product available: [product_name] - 在庫状況が
noの場合:プログラムはカスタムメッセージ "Product should be in stock" とともにパニックを起こします(これはこのチャレンジで期待される動作です)
注意: 在庫状況が no の場合、None に対して .expect() を呼び出すと、カスタムメッセージとともにパニックが発生します。これは、.expect() が .unwrap() と比較して、いかに役立つエラー情報を提供するかを示しています。
チートシート
.expect()メソッドは.unwrap()と同様に動作しますが、エラーのデバッグを容易にするためにカスタムのパニックメッセージを指定することができます。
Optionに対して呼び出された場合:
Someが含まれている場合、中の値を返しますNoneが含まれている場合、カスタムメッセージとともにパニックを発生させます
let maybe_score = Some(95);
let score = maybe_score.expect("Score should always be present");
println!("Your score is: {}", score);カスタムエラーメッセージにより、コードのどこで何が問題になったのかを特定しやすくなります。
自分で試してみよう
use std::io;
fn main() {
// 商品名を読み込む
let mut product_name = String::new();
io::stdin().read_line(&mut product_name).expect("Failed to read line");
let product_name = product_name.trim();
// 在庫状況を読み込む
let mut stock_status = String::new();
io::stdin().read_line(&mut stock_status).expect("Failed to read line");
let stock_status = stock_status.trim();
// TODO: 以下にコードを記述してください
// stock_statusに基づいてOption<String>を作成します
// .expect()を使用して商品名を取り出します
// 次の形式で結果を出力します: Product available: [product_name]
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。