Dev Study
← 解説「? 演算子 — エラーの委譲」に戻る

サンプルコードで身につける: ? 演算子 — エラーの委譲

解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1? の基本 — match を1文字に畳む

parse の結果に ? を付けると、Ok なら中身を取り出して続行、Err ならその場で関数から return されます。前レッスンで毎回書いていた match が1文字になった、と対比して読んでください。main の戻り値を Result にすれば main でも ? が使えます。

Rust

2? を連ねてネストをなくす

失敗しうる処理が2つ以上続くとき、match で書くとネストが深くなりますが、? なら1行ずつ平らに並べられます。どこか1つでも Err になれば、その時点で関数全体が Err を返します。複数の入力をパースして組み合わせる処理の定番形です。

Rust

3途中は ? で流し、最後に match でさばく

実務の Rust では「途中の関数はエラーを ? で呼び出し元に流し、いちばん外側でまとめて処理する」というスタイルが主流です。to_seconds は変換の失敗を自分で処理せず、main が成功・失敗の両方を表示で受け止めます。エラー処理の場所を1か所に集める設計の縮図です。

Rust

4Option にも ? が使える

? は Result 専用ではなく、Option を返す関数の中では「None ならその場で None を return」として働きます。get で先頭要素を取り出す処理が、match なしの1行になります。Option を返すヘルパー関数を重ねるときに同じ形が使えます。

Rust

5複数フィールドの組み立てを ? でつなぐ

幅と高さの2つの入力を検証付きでパースし、どちらが失敗してもエラーメッセージごと呼び出し元に届く例です。エラー型を揃えておけば(ここでは String)、? が何段でも素直につながります。設定ファイルやフォーム入力から値を組み立てる実務処理の縮図です。

Rust