この回では、既存のCLIへ新しい要求を実装し、型、所有権、テストの選択を説明します。前提は第19回までです。
卒業課題
タスク管理CLIへ検索と並び替えを追加してください。検索は題名の部分一致とし、大文字・小文字を区別する仕様から始めます。未完了だけを表示でき、表示順をID順または題名順で選べるようにします。存在するタスクの所有権を不要に奪わず、表示用の選択結果を作ることを目標にします。
次にタスクをJSONへexportする操作を追加します。通常の保存先とexport先を区別し、出力に失敗した場合は成功メッセージを出しません。旧データとの互換性、文字数の定義、空の検索文字列の扱いをREADMEへ書きます。
解答へ至る設計例
&[Task] を受け取り、条件に合う Vec<&Task> を返す選択関数を作れます。元のデータを借りるため、表示後も所有者が保持できます。戻り値の参照が入力に結び付くことを型で表し、必要ならライフタイムを明示します。
並び替えは選択結果の参照の列を並び替え、元の保存順を意図せず変えないようにします。題名が同じ場合の順番はIDで決めると再現できます。CLIの引数が増えたらclapなどのライブラリも候補ですが、導入前に現在の引数契約をテストとして残します。
合格基準
- Move、Copy、Clone、借用の違いを実例で説明できる。
- 戻す参照がどの値に依存するかを説明できる。
- 不在をOption、失敗をResultとして扱い、入力エラーをunwrapしない。
- enumとトレイトの選択理由を、変更のしやすさから説明できる。
- 破損、重複、上限、保存失敗を含むテストを作れる。
- スレッド安全でもデッドロックや業務上の誤りは残ると理解している。
コンパイルエラーが出ない速さを競う必要はありません。エラーを読み、所有関係を説明し、必要な変更を小さく行えることが大切です。読了に加えて卒業課題を実装すると、入門の写経を越えた力を確かめられます。
次に深める方向
サーバーならHTTP、認証、SQL、非同期キャンセルと負荷制御へ進みます。CLIなら互換性、設定、配布、ログへ進みます。低レベル処理ならメモリ配置やFFIを学びますが、unsafeは所有権エラーを消すための近道ではありません。安全なAPIが守るべき不変条件を説明できるようになってから扱います。
公式資料
The Rust Programming LanguageとRust API Guidelinesを次の学習の入口にできます。