rust-iterator-collections について
明確なイテレーターおよびコレクションコードを書くための Rust スキルです。標準 API とレビュー項目を使い、所有権、割り当て、順序、エラー処理を明示します。
主な機能
- 01所有権に応じた反復方法の選択
- 02明瞭さを高める場合のアダプター利用
- 03失敗時に早期終了する反復処理
- 04entry API によるマップ更新
- 05アクセス方法に応じたコレクション選択
- 06順序の維持と余分な割り当ての回避
活用シーン
- 01コレクション処理ループのリファクタリング
- 02失敗しうるイテレーターパイプラインの処理
- 03マップの挿入または更新ロジックの実装
- 04順序と重複項目の動作確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ lvtd-llc/ skills --skill rust-iterator-collectionsインストール後、Claude Code で/rust-iterator-collectionsを入力して読み込まれたか確認します。
同梱ファイルagents/openai.yamlreferences/iterator-collection-patterns.md
詳細
Rust のイテレーターとコレクション
コレクションのコードを、明確で慣用的な Rust に書き換える際にこのスキルを使います。処理を直接表現できるイテレーター API やコレクション API を優先しつつ、所有権、メモリアロケーション、エラーの挙動が分かるようにします。
基本的なワークフロー
- 入力の所有権モードを特定します。借用による反復、可変反復、または消費を伴う反復のいずれかです。
- 最も単純なイテレーターの形式を選びます。
iter、iter_mut、into_iter、範囲、drain、またはコレクション固有のメソッドです。 - 結果のコードがより明確になる場合に限り、手動のループをアダプターに置き換えます。複雑な分岐、早期の変更、デバッグが必要な場合は、明示的なループを維持します。
- エラー発生時に処理を中断する必要がある場合は、
collect::<Result<Vec<_>, _>>()、try_fold、try_for_eachなどの失敗しうるイテレーター処理を使います。 - 挿入または更新のロジックには、
HashMap::entryまたはBTreeMap::entryを使います。 - 不要な中間
Vecは避けます。可能であれば、イテレーターを連結するか、既存のコレクションに追加します。 - 空の入力、要素が 1 つの入力、重複キー、順序に関する期待値、エラー発生時の処理中断をテストします。
イテレーターのルール
- 関数で反復だけが必要な場合は、
impl IntoIterator<Item = T>を受け取ります。 - スライスの意味論で十分な場合は
&[T]を使い、&Vec<T>は避けます。 mapの後にNoneを破棄する場合はfilter_mapを使います。各要素を 0 個以上の要素に展開する場合はflat_mapを使います。- 状態を持つ変換では、停止動作が明確になる場合に
map_whileまたはscanを使います。 - 型注釈は
collectの境界に追加し、パイプライン全体には追加しません。 - イテレーターの要素を意図的に複製する場合は、
map(|x| x.clone())よりclonedまたはcopiedを優先します。
コレクションのルール
ループをリファクタリングする場合、またはコレクションの変更をレビューする場合は、references/iterator-collection-patterns.md を読みます。
- 順序付きの連続データには
Vec、両端で push/pop するキューのような用途にはVecDeque、優先度付きキューにはBinaryHeap、順序なしの検索にはHashMap、ソート済みの検索や範囲検索にはBTreeMapを使います。 - 借用した要素を別途反復しながらコレクションを変更するのではなく、
retain、drain、splice、split_offを使います。 - デフォルト値の構築コストが高い場合は
Entry::or_insert_withを使います。 - 順序を意図的に維持します。反復順序が動作の一部である場合は、
BTreeMapをHashMapに置き換えないでください。 - サイズが分かっている場合、またはプロファイリングで再アロケーションが重要だと分かった場合に限り、容量を事前確保します。
レビューチェックリスト
- パイプラインから所有権とエラーの挙動が明確に読み取れます。
entryのほうが簡潔な場面で、contains_keyの後にinsertを使っていません。- 再度反復するだけの目的で、避けられる
collect::<Vec<_>>()を使っていません。 - インデックスは、インデックス自体が処理の対象である場合に限り使っています。
- 必要に応じて、重複、空の入力、決定的な順序をテストしています。
コメント
Markdown 対応