Menu
Coddy logo textTech

'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),
}

ResultOkの場合、matchは成功した値を取り出し、最初のアームを実行します。Errの場合はエラー情報を取り出し、2番目のアームを実行します。このパターンにより、潜在的なエラーを誤って無視してしまうことがなくなります。

challenge icon

チャレンジ

簡単

2つの入力を受け取ります。最初の入力は数値(文字列として)、2番目の入力は別の数値(文字列として)です。最初の数値を2番目の数値で除算することを試み、Result<f64, &'static str> を返す関数を作成してください。2番目の数値がゼロの場合は、"Division by zero" というメッセージとともに Err を返します。それ以外の場合は、除算結果とともに Ok を返します。match 式を使用して OkErr の両方のケースを処理し、適切なメッセージを出力してください。

要件:

  • 最初の入力(被除数)を読み込み、空白をトリミングする
  • 最初の入力を 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 を使用して、ResultOk バリアントと Err バリアントの両方を処理します:

let result = divide(10, 2);

match result {
    Ok(value) => println!("Division successful: {}", value),
    Err(error) => println!("Division failed: {}", error),
}

match 式を使用すると、成功と失敗の両方のケースを強制的に処理することになります。ResultOk の場合、成功した値を取り出して最初の腕(アーム)を実行します。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]" を出力する
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Logic & Flowのすべてのレッスン