is_ok() と is_err()
CoddyのRustジャーニー「Logic & Flow」セクションの一部 — レッスン 44/66。
実際の値を取り出すことなく、Resultが成功か失敗かを表しているかどうかを素早く確認したい場合があります。Rustはこのための2つの便利なメソッド、.is_ok()と.is_err()を提供しています。
どちらのメソッドもブール値を返すため、単純な条件チェックに最適です。.is_ok() メソッドは、Result が Ok の場合に true を返し、Err の場合に false を返します。.is_err() メソッドはその逆で、次のように動作します:
let success: Result = Ok(42);
let failure: Result = Err("Something went wrong");
if success.is_ok() {
println!("Operation succeeded!");
}
if failure.is_err() {
println!("Operation failed!");
}これらのメソッドは、内部の具体的な値を気にせずに、結果のステータスだけを知る必要がある場合に特に便利です。match とは異なり、これらは Result を消費しないため、その後も引き続き使用できます。
チャレンジ
簡単2つの入力を受け取ります。最初の入力は数値(文字列として)、2番目の入力はステータスインジケータ(success または failure)です。ステータスに基づいて Result<i32, &'static str> を作成してください。ステータスが success の場合は、パースした数値を含む Ok を作成します。ステータスが failure の場合は、メッセージ "Operation failed" を持つ Err を作成します。.is_ok() と .is_err() を使用して結果のステータスを確認し、適切なメッセージを出力してください。
要件:
- 最初の入力(数値)を読み込み、空白をトリミングする
- 最初の入力を
i32にパースする - 2番目の入力(ステータス)を読み込み、空白をトリミングする
Result<i32, &'static str>変数を作成する:- ステータスが
successの場合、Ok(parsed_number)を割り当てる - ステータスが
failureの場合、Err("Operation failed")を割り当てる
- ステータスが
.is_ok()を使用して結果が成功かどうかを確認する:- true の場合、次を出力する:
Success detected
- true の場合、次を出力する:
.is_err()を使用して結果がエラーかどうかを確認する:- true の場合、次を出力する:
Error detected
- true の場合、次を出力する:
入力:
- 1行目: 数値 (例:
42) - 2行目:
successまたはfailureのいずれか
出力:
- ステータスが
successの場合:Success detected - ステータスが
failureの場合:Error detected
チートシート
Rustは、値を抽出せずにResultの状態を確認するための2つのメソッドを提供しています:
.is_ok()-ResultがOkの場合はtrueを、それ以外の場合はfalseを返します.is_err()-ResultがErrの場合はtrueを、それ以外の場合はfalseを返します
let success: Result<i32, &str> = Ok(42);
let failure: Result<i32, &str> = Err("Something went wrong");
if success.is_ok() {
println!("Operation succeeded!");
}
if failure.is_err() {
println!("Operation failed!");
}これらのメソッドは、結果の状態だけを知る必要がある単純な条件チェックに便利です。matchとは異なり、これらはResultを消費しないため、後で使用することができます。
自分で試してみよう
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番目の入力(ステータス)を読み込む
let mut status = String::new();
io::stdin().read_line(&mut status).expect("Failed to read line");
let status = status.trim();
// TODO: ステータスに基づいて Result<i32, &'static str> を作成する
// ステータスが "success" の場合は Ok(parsed_number) を作成
// ステータスが "failure" の場合は Err("Operation failed") を作成
// TODO: .is_ok() と .is_err() を使用して結果を確認し、適切なメッセージを出力する
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Logic & Flowのすべてのレッスン
7'Result' によるエラーハンドリング
'Result' とは?'Result' で 'match' を使うis_ok() と is_err()ショートカット: unwrap と expectクエスチョンマーク演算子 '?'文字列から数値へのパースまとめ - 安全な除算関数