0Pricing
Learn Rust Coding · レッスン

Resultと?演算子

エラーを伝播します

「Resultと?演算子」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。

Result 型

Result<T, E> は、Ok(T) で成功するか、Err(E) で失敗する操作を表します。Rust における主要なエラー処理用の型です。

fn main() {
    let parsed: Result<i32, _> = "42".parse::<i32>();
    println!("{:?}", parsed);
}

Result とのマッチング

match を使うと、両方の結果を明示的に処理できます。

fn main() {
    match "oops".parse::<i32>() {
        Ok(n) => println!("got {n}"),
        Err(e) => println!("error: {e}"),
    }
}

Result の返却

失敗する可能性のある関数は Result を返し、エラーをどう処理するかを呼び出し側に委ねます。

fn halve(n: i32) -> Result<i32, String> {
    if n % 2 == 0 {
        Ok(n / 2)
    } else {
        Err("odd number".to_string())
    }
}

fn main() {
    println!("{:?}", halve(10));
    println!("{:?}", halve(7));
}

? 演算子

? 演算子は Ok の値を取り出し、Err なら関数から早期に返します。冗長な match と return のコードを置き換えられます。

fn double_str(s: &str) -> Result<i32, std::num::ParseIntError> {
    let n = s.parse::<i32>()?;
    Ok(n * 2)
}

fn main() {
    println!("{:?}", double_str("21"));
    println!("{:?}", double_str("x"));
}

? による連結

失敗する可能性のある複数の処理は、? で連結すると簡潔に読めます。最初のエラーが発生すると、残りの処理は短絡されます。

fn sum_two(a: &str, b: &str) -> Result<i32, std::num::ParseIntError> {
    let x = a.parse::<i32>()?;
    let y = b.parse::<i32>()?;
    Ok(x + y)
}

fn main() {
    println!("{:?}", sum_two("3", "4"));
}

main での ?

main は Result を返せるため、そこで ? を使うこともできます。返された Err によって、プログラムはゼロ以外の終了コードで終了します。

fn main() -> Result<(), std::num::ParseIntError> {
    let n: i32 = "100".parse()?;
    println!("parsed {n}");
    Ok(())
}

便利な Result のメソッド

便利なコンビネーター:

  • unwrap_or(default) — 値、または代替値を取得する
  • map — Ok の値を変換する
  • map_err — エラーを変換する
  • is_ok / is_err — バリアントを確認する
fn main() {
    let n = "x".parse::<i32>().unwrap_or(-1);
    println!("{n}");
}

Option から Result へ

ok_or を使って Option を Result に変換すると、? で意味のあるエラーを伝播できます。

fn first_char(s: &str) -> Result<char, String> {
    let c = s.chars().next().ok_or("empty string".to_string())?;
    Ok(c)
}

fn main() {
    println!("{:?}", first_char("hi"));
    println!("{:?}", first_char(""));
}

? によるエラー変換の仕組み

エラー型が異なる場合、? は From::from を呼び出して、関数で宣言されたエラー型に変換します。これにより、層をまたいだエラー処理を簡潔に記述できます。

本番環境で unwrap を避ける

unwrap と expect は Err で panic を発生させます。例やテストでは問題ありませんが、実際のコードでは失敗を回復可能にするため、? または明示的な処理を優先してください。

and_then の連結

and_then は、前の処理が成功した場合にだけ次の失敗する可能性がある処理を実行し、値を次へ渡します。

fn main() {
    let result = "8"
        .parse::<i32>()
        .and_then(|n| Ok(n * 2));
    println!("{:?}", result);
}

確認問題

Err である Result に ? 演算子を適用すると、何が起こりますか?

まとめ

Resultベースのエラーハンドリングを学びました。

  • Result<T, E> は成功または失敗を表します
  • ? は Ok を取り出すか、早期に Err を返します
  • ? は Result を返す関数や main で使用できます
  • map、map_err、unwrap_or、ok_or などのコンビネータが役立ちます
  • 本番環境では unwrap を避けてください

よくある質問

「Resultと?演算子」レッスンは無料ですか?

はい。「Resultと?演算子」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。

「Resultと?演算子」で何を学びますか?

エラーを伝播します ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Learn Rust Codingを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「Resultと?演算子」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLearn Rust Codingレッスンでコードを書いて実行できますか?

はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Resultと?演算子
  2. thiserror
  3. anyhow
  4. エラー変換
← Learn Rust Codingに戻る