'Result' で 'match' を使う
CoddyのRustジャーニー「Logic & Flow」セクションの一部 — レッスン 43/66。
Resultが何であるかを理解したところで、成功と失敗の両方のケースを処理するための、最も明示的で強力な方法であるmatch式の使い方を学びましょう。
Option と同様に、match を使用すると Result の両方のバリアントを処理することが強制されます。成功を処理するために Ok のアームを1つ作成し、失敗を処理するために Err の別のアームを作成します。
let result = divide(10, 2);
match result {
Ok(value) => println!("Division successful: {}", value),
Err(error) => println!("Division failed: {}", error),
}ResultがOkの場合、matchは成功した値を取り出し、最初のアームを実行します。Errの場合はエラー情報を取り出し、2番目のアームを実行します。このパターンにより、潜在的なエラーを誤って無視してしまうことがなくなります。
チャレンジ
簡単2つの入力を受け取ります。最初の入力は数値(文字列として)、2番目の入力は別の数値(文字列として)です。最初の数値を2番目の数値で除算することを試み、Result<f64, &'static str> を返す関数を作成してください。2番目の数値がゼロの場合は、"Division by zero" というメッセージとともに Err を返します。それ以外の場合は、除算結果とともに Ok を返します。match 式を使用して Ok と Err の両方のケースを処理し、適切なメッセージを出力してください。
要件:
- 最初の入力(被除数)を読み込み、空白をトリミングする
- 最初の入力を
f64にパースする - 2番目の入力(除数)を読み込み、空白をトリミングする
- 2番目の入力を
f64にパースする - 2つの
f64パラメータを受け取り、Result<f64, &'static str>を返す関数を作成する - 関数内で、除数が
0.0かどうかを確認する:- はいの場合、
Err("Division by zero")を返す - いいえの場合、
Ok(dividend / divisor)を返す
- はいの場合、
- パースした2つの数値を使用して関数を呼び出す
match式を使用してResultを処理するOk(value)アームでは、Result: [value]と出力するErr(error)アームでは、Error: [error]と出力する
入力:
- 1行目: 被除数を表す数値 (例:
10.0) - 2行目: 除数を表す数値 (例:
2.0)
出力:
- 除算が成功した場合:
Result: [result] - ゼロ除算の場合:
Error: Division by zero
チートシート
match を使用して、Result の Ok バリアントと Err バリアントの両方を処理します:
let result = divide(10, 2);
match result {
Ok(value) => println!("Division successful: {}", value),
Err(error) => println!("Division failed: {}", error),
}match 式を使用すると、成功と失敗の両方のケースを強制的に処理することになります。Result が Ok の場合、成功した値を取り出して最初の腕(アーム)を実行します。Err の場合は、エラー情報を取り出して2番目の腕を実行します。
自分で試してみよう
use std::io;
// TODO: ここで Result<f64, &'static str> を返す divide 関数を作成してください
fn main() {
// 最初の入力(被除数)を読み込む
let mut dividend_input = String::new();
io::stdin().read_line(&mut dividend_input).expect("Failed to read line");
let dividend: f64 = dividend_input.trim().parse().expect("Invalid number");
// 2番目の入力(除数)を読み込む
let mut divisor_input = String::new();
io::stdin().read_line(&mut divisor_input).expect("Failed to read line");
let divisor: f64 = divisor_input.trim().parse().expect("Invalid number");
// TODO: divide 関数を呼び出し、match を使用して Result を処理してください
// Ok の場合は "Result: [value]" を出力する
// Err の場合は "Error: [error]" を出力する
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Logic & Flowのすべてのレッスン
7'Result' によるエラーハンドリング
'Result' とは?'Result' で 'match' を使うis_ok() と is_err()ショートカット: unwrap と expectクエスチョンマーク演算子 '?'文字列から数値へのパースまとめ - 安全な除算関数