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