ショートカット: unwrap と expect
CoddyのRustジャーニー「論理とフロー」セクションの一部。レッスン 45/66。
これまでに、Optionで使う.unwrap()と.expect()について学びました。これらのメソッドはResultでも使えます。ただし、成功時と失敗時の動作は少し異なります。
.unwrap()メソッドはOkバリアントから値を取り出しますが、ResultがErrの場合、プログラムはパニックを起こしてクラッシュします。同様に、.expect()も同じ処理を行いますが、デバッグを容易にするカスタムのパニックメッセージを指定できます。
let success: Result = Ok(42);
let value = success.expect("This should work!");
println!("Value: {}", value); // 出力: Value: 42
// これはカスタムメッセージを表示してパニックします:
// let failure: Result = Err("Something went wrong");
// let value = failure.expect("This should work!"); // パニックします!これらのメソッドを使うと成功した値にすばやくアクセスできますが、慎重に使用する必要があります。操作が確実に成功すると確信している場合や、開発・テスト中に使うのが最適です。
チャレンジ
簡単2つの入力を受け取ります。1つ目の入力は数値(文字列として)、2つ目の入力は状態を示す値(ok または error)です。状態に基づいて Result<i32, &'static str> を作成してください。状態が ok の場合は、解析した数値を含む Ok を作成してください。状態が error の場合は、メッセージ "Invalid operation" を含む Err を作成してください。カスタムメッセージを指定した .expect() を使って Result から値を取り出し、出力してください。
要件:
- 1つ目の入力(数値)を読み取り、空白を削除する
- 1つ目の入力を
i32に解析する - 2つ目の入力(状態)を読み取り、空白を削除する
Result<i32, &'static str>型の変数を作成する:- 状態が
okの場合は、Ok(parsed_number)を代入する - 状態が
errorの場合は、Err("Invalid operation")を代入する
- 状態が
.expect("Failed to get value")を使ってResultから値を取り出す- 取り出した値を次の形式で出力する:
Value: [value]
入力:
- 1行目: 数値(例:
75) - 2行目:
okまたはerror
出力:
- 状態が
okの場合:Value: [number] - 状態が
errorの場合: プログラムはカスタムメッセージとともにパニックを起こします(このチャレンジではテストされません)
注: このチャレンジでは、正常に実行できることを確認するため、テストケースでは ok の状態のみを使用します。error の場合はパニックが発生します。これは Err に遭遇したときの .expect() の想定された動作です。
自分で試してみよう
use std::io;
fn main() {
// 最初の入力(数値)を読み取る
let mut number_input = String::new();
io::stdin().read_line(&mut number_input).expect("Failed to read line");
let number_input = number_input.trim();
// 数値を i32 に変換する
let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
// 2 番目の入力(status)を読み取る
let mut status = String::new();
io::stdin().read_line(&mut status).expect("Failed to read line");
let status = status.trim();
// TODO: 以下にコードを書く
// status に基づいて Result<i32, &'static str> を作成する
// .expect() を使って値を取り出す
// 結果を Value: [value] の形式で出力する
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
7'Result' によるエラーハンドリング
'Result' とは?'Result' で 'match' を使うis_ok() と is_err()ショートカット: unwrap と expectクエスチョンマーク演算子 '?'文字列から数値へのパースまとめ - 安全な除算関数自分で練習してみよう: Rustオンラインコンパイラ