mcpField
R
rust-skills

rust-skills

github.com/leonardomso開発6526.5k 回インストール19 週間前に更新
リポジトリ

rust-skills について

Rust コードの作成、レビュー、リファクタリングに使う実践ガイドです。優先度別のルールで、所有権、エラー処理、非同期処理、並行処理、パフォーマンスなどを扱います。

主な機能

  1. 01優先度別に Rust の指針を整理
  2. 02所有権と借用を解説
  3. 03エラー処理と非同期コードを案内
  4. 04並行処理と unsafe コードを扱う
  5. 05API 設計と性能の指針を提示
  6. 06テスト、文書化、プロジェクト構成を網羅

活用シーン

  1. 01Rust の関数やモジュールを新規作成
  2. 02所有権や借用の問題をレビュー
  3. 03非同期・並行・unsafe 実装を改善
  4. 04Rust プロジェクトをリファクタリング・最適化

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/leonardomso/rust-skills --skill rust-skills

インストール後、Claude Code で/rust-skillsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

AGENTS.md
CLAUDE.md
CHANGELOG.md
LICENSE
CONTRIBUTING.md
README.md
.github/workflows/
ci.yml
checks/
.gitignore
Cargo.lock
Cargo.toml
README.md
check.sh
baseline.txt
gen.py
analyze.py
rust-toolchain.toml
gen_index.py
validate.py
checks/src/
lib.rs
rules/
anti-collect-intermediate.md
anti-clone-excessive.md
anti-index-over-iter.md
anti-expect-lazy.md
anti-format-hot-path.md
anti-empty-catch.md
anti-lock-across-await.md
anti-panic-expected.md
anti-over-abstraction.md
anti-premature-optimize.md
anti-stringly-typed.md

詳細

Rust のベストプラクティス

高品質で慣用的、かつ高度に最適化された Rust コードを書くための包括的なガイドです。LLM によるコード生成とリファクタリングを支援するため、影響度に基づいて優先順位付けされた 26 カテゴリー、265 個のルールが含まれています。Rust 1.96(2024 エディション)に対応しています。

適用する場面

以下の場合に、これらのガイドラインを参照してください。

  • Rust の関数、構造体、モジュールを新しく作成するとき
  • エラー処理や非同期コードを実装するとき
  • 並行処理、並列処理、または unsafe コードを書くとき
  • ライブラリの公開 API を設計するとき
  • 所有権や借用に関する問題についてコードをレビューするとき
  • メモリ使用量を最適化したり、割り当てを減らしたりするとき
  • ホットパスのパフォーマンスを調整するとき
  • 既存の Rust コードをリファクタリングするとき

優先度別のルールカテゴリー

優先度カテゴリー影響度プレフィックスルール数
1所有権と借用CRITICALown-12
2エラー処理CRITICALerr-12
3メモリ最適化CRITICALmem-17
4unsafe コードCRITICALunsafe-7
5API 設計HIGHapi-17
6Async/AwaitHIGHasync-18
7並行処理HIGHconc-4
8コンパイラー最適化HIGHopt-12
9数値と算術の安全性HIGHnum-5
10型安全性MEDIUMtype-13
11トレイトとジェネリクスの設計MEDIUMtrait-6
12変換MEDIUMconv-3
13const とコンパイル時処理MEDIUMconst-4
14SerdeMEDIUMserde-8
15パターンマッチングMEDIUMpat-5
16マクロMEDIUMmacro-8
17クロージャMEDIUMclosure-5
18コレクションMEDIUMcoll-4
19命名規則MEDIUMname-16
20テストMEDIUMtest-15
21ドキュメントMEDIUMdoc-12
22可観測性MEDIUMobs-7
23パフォーマンスパターンMEDIUMperf-13
24プロジェクト構成LOWproj-14
25Clippy と lintLOWlint-13
26アンチパターンREFERENCEanti-15

クイックリファレンス

1. 所有権と借用(CRITICAL)
  • own-borrow-over-clone - .clone() よりも &T による借用を優先する
  • own-slice-over-vec - &Vec<T> ではなく &[T] を、&String ではなく &str を受け取る
  • own-cow-conditional - 条件付き所有権には Cow<'a, T> を使う
  • own-arc-shared - スレッドセーフな共有所有権には Arc<T> を使う
  • own-rc-single-thread - シングルスレッドのコンテキストで共有所有権を実現するには Rc<T> を使う
  • own-refcell-interior - シングルスレッドコードで内部可変性を実現するには RefCell<T> を使う
  • own-mutex-interior - スレッド間で内部可変性を実現するには Mutex<T> を使う
  • own-rwlock-readers - 書き込みより読み取りが大幅に多い場合は RwLock<T> を使う
  • own-copy-small - 小さく単純な型には Copy を実装する
  • own-clone-explicit - コピーに意味のあるコストが伴う型には、明示的な Clone を使う
  • own-move-large - 大きな型はコピーせずにムーブし、ムーブのコストが高い場合は Box を使う
  • own-lifetime-elision - ライフタイム省略規則に従い、必要な場合にのみ明示的なライフタイムを追加する
2. エラー処理(重大)
  • err-thiserror-lib - ライブラリのエラー型には thiserror を使用します
  • err-anyhow-app - アプリケーションのエラー処理には anyhow を使用します
  • err-result-over-panic - 回復可能なエラーではパニックを起こさず、Result<T, E> を返します
  • err-context-chain - .context() または .with_context() でコンテキストを追加します
  • err-no-unwrap-prod - 本番コードでは unwrap() を避け、?、expect()、またはエラー処理を使用します
  • err-expect-bugs-only - expect() はユーザーエラーではなく、バグを示す不変条件に対してのみ使用します
  • err-question-mark - 簡潔にエラーを伝播するには ? 演算子を使用します
  • err-from-impl - ? 演算子を使えるよう、エラー変換用に From<E> を実装します
  • err-source-chain - #[source] または source() メソッドでエラーチェーンを保持します
  • err-lowercase-msg - エラーメッセージは小文字で始め、末尾に句読点を付けません
  • err-doc-errors - ドキュメントコメントの # Errors セクションでエラー条件を説明します
  • err-custom-type - ドメイン固有の失敗に対してカスタムエラー型を定義します
3. メモリ最適化(重大)
  • mem-with-capacity - サイズが既知の場合は with_capacity() を使用します
  • mem-smallvec - 通常は小さいコレクションに SmallVec を使用します
  • mem-arrayvec - ヒープ割り当てが発生しない固定容量のコレクションには ArrayVec<T, N> を使用します
  • mem-box-large-variant - 大きな列挙型バリアントを Box 化し、列挙型全体のサイズを削減します
  • mem-boxed-slice - 固定サイズのヒープデータには Vec<T> ではなく Box<[T]> を使用します
  • mem-thinvec - オーバーヘッドを最小限に抑えた nullable コレクションには ThinVec<T> を使用します
  • mem-clone-from - 繰り返しクローンする際に割り当てを再利用するには clone_from() を使用します
  • mem-reuse-collections - ループ内で新しいコレクションを作成せず、コレクションをクリアして再利用します
  • mem-avoid-format - 文字列リテラルで済む場合は format!() を避けます
  • mem-write-over-format - format!() による割り当てではなく、既存のバッファに write!() を使用します
  • mem-arena-allocator - 一括割り当てにはアリーナアロケーターを使用します
  • mem-zero-copy - スライスと Bytes を使ったゼロコピーのパターンを使用します
  • mem-compact-string - メモリに制約のある文字列ストレージにはコンパクトな文字列型を使用します
  • mem-smaller-integers - メモリ使用量を削減するため、適切なサイズの整数を使用します
  • mem-assert-type-size - 型サイズの意図しない増大を防ぐため、静的アサーションを使用します
  • mem-take-replace - クローンせずに &mut から値を取り出すには mem::take / mem::replace を使用します
  • mem-drop-order - ドロップ順序を把握して制御します。構造体のフィールドは上から下へ、ローカル変数は逆順にドロップされます
4. 安全でないコード(CRITICAL)
  • unsafe-safety-comment - すべての unsafe ブロックの上に // SAFETY: コメントを、すべての unsafe fn に # Safety セクションを記述します。
  • unsafe-minimize-scope - unsafe ブロックは可能な限り小さくします。安全でない操作だけを対象にし、その周囲の安全なコードは含めません。
  • unsafe-miri-ci - unsafe コードを含むすべてのクレートについて、CI で cargo miri test を実行します。
  • unsafe-maybeuninit - 初期化されていないメモリには MaybeUninit<T> を使用します。有効性の不変条件がある型には、mem::uninitialized() や mem::zeroed() を決して使用しません。
  • unsafe-extern-block - Rust 2024 では、extern ブロックを unsafe extern { } で囲み、各項目に safe または unsafe を指定します。
  • unsafe-send-sync-manual - Send または Sync を手動で実装する場合は、不変条件を文書化します。コンパイラーによる自動導出を優先します。
  • unsafe-no-mangle-unsafe - Rust 2024 では、属性をそのまま使うのではなく、#[unsafe(no_mangle)]、#[unsafe(export_name = "...")]、#[unsafe(link_section = "...")] と記述します。
5. API 設計(HIGH)
  • api-builder-pattern - 複雑な構築には Builder パターンを使用します
  • api-builder-must-use - ビルダーメソッドに #[must_use] を付け、結果が暗黙に破棄されるのを防ぎます
  • api-newtype-safety - 意味の異なる値が混同されないよう、newtype を使用します
  • api-typestate - 型システムでステートマシンの不変条件を表現するには、typestate パターンを使用します
  • api-sealed-trait - 外部からの実装を防ぎつつ使用を許可するには、sealed trait を使用します
  • api-extension-trait - 外部の型にメソッドを追加するには、拡張トレイトを使用します
  • api-parse-dont-validate - 境界で検証済みの型にパースします
  • api-impl-into - 柔軟な API にするには impl Into<T> を受け入れ、変換には From<T> を実装します
  • api-impl-asref - 内部データを借用するだけでよい場合は、AsRef<T> を使用します
  • api-must-use - 結果を無視するとバグになる可能性が高い型や関数には、#[must_use] を付けます
  • api-non-exhaustive - 前方互換性のため、公開される enum と struct に #[non_exhaustive] を使用します
  • api-from-not-into - Into<U> ではなく From<T> を実装します。From を実装すれば Into も自動的に使えます
  • api-default-impl - 妥当なデフォルト値を持つ型には Default を実装します
  • api-common-traits - 公開型には標準トレイト(Debug、Clone、PartialEq など)を実装します
  • api-serde-optional - ライブラリークレートでは、serde を必須の依存関係ではなく、機能フラグにします
  • api-impl-fromiterator - コレクション型には FromIterator と Extend を、3 種類すべての参照形式には IntoIterator を実装します
  • api-operator-overload - 演算子のオーバーロードは、意味が自然で、予想外にならない場合に限って行います
6. Async/Await(HIGH)
  • async-tokio-runtime - ワークロードに応じて Tokio ランタイムを適切に設定します
  • async-no-lock-await - .await をまたいで Mutex/RwLock を保持しないでください
  • async-spawn-blocking - CPU 負荷の高い処理には spawn_blocking を使用します
  • async-tokio-fs - 非同期コードでは std::fs の代わりに tokio::fs を使用します
  • async-cancellation-token - グレースフルシャットダウンとタスクのキャンセルには CancellationToken を使用します
  • async-join-parallel - 独立したフューチャーを並行実行するには join! または try_join! を使用します
  • async-try-join - エラー時に早期リターンする、失敗する可能性のある操作の並行実行には try_join! を使用します
  • async-select-racing - フューチャーを競合させ、最初に完了したものを処理するには select! を使用します
  • async-bounded-channel - バックプレッシャーを適用し、メモリの無制限な増加を防ぐには、バウンド付きチャネルを使用します
  • async-mpsc-queue - タスク間の非同期メッセージキューには mpsc チャネルを使用します
  • async-broadcast-pubsub - すべてのサブスクライバーがすべてのメッセージを受信する pub/sub には、broadcast チャネルを使用します
  • async-watch-latest - 複数の監視者と最新の値を共有するには、watch チャネルを使用します
  • async-oneshot-response - リクエスト/レスポンスのパターンには oneshot チャネルを使用します
  • async-joinset-structured - 動的なスポーン済みタスクの集合を管理するには JoinSet を使用します
  • async-clone-before-await - サスペンド中に参照を保持しないよう、await ポイントの前に Arc/Rc データをクローンします
  • async-fn-in-trait - async_trait マクロの代わりに、トレイトでネイティブの async fn(安定版 1.75)を使用します
  • async-async-fn-bounds - F: Fn() -> Fut, Fut: Future の代わりに、AsyncFn/AsyncFnMut/AsyncFnOnce 境界を使用します
  • async-cancel-safety - tokio::select! の分岐で使用するフューチャーがキャンセルセーフであることを確認します
7. Concurrency(HIGH)
  • conc-rayon-par-iter - CPU バウンドのデータ並列処理には rayon の par_iter() を使用します
  • conc-scoped-threads - スレッド間でスタックデータを借用するには std::thread::scope を使用します
  • conc-atomic-ordering - 各アトミック操作には、正しく動作する範囲で最も弱いメモリ Ordering を使用します
  • conc-thread-local - static mut よりも Cell/RefCell を使った thread_local! を優先します
8. コンパイラー最適化(HIGH)
  • opt-inline-small - 小さなホット関数には #[inline] を使用します
  • opt-inline-always-rare - #[inline(always)] は控えめに使用し、プロファイリングで重要なホットパスと確認できた場合に限ります
  • opt-inline-never-cold - エラーパスや実行頻度の低いコードには #[inline(never)] と #[cold] を使用します
  • opt-cold-unlikely - コンパイラーの最適化を助けるため、発生しにくいコードパスに #[cold] を付けます
  • opt-likely-hint - 発生しやすい分岐を示すにはコード構造を利用し、nightly では組み込み関数を使用します
  • opt-lto-release - リリースビルドで LTO を有効にします
  • opt-codegen-units - リリースビルドで最大限の最適化を行うには、codegen-units = 1 を設定します
  • opt-pgo-profile - 最大限のパフォーマンスを実現するには、プロファイル誘導最適化(PGO)を使用します
  • opt-target-cpu - デプロイ先が既知の場合に最大限のパフォーマンスを得るには、target-cpu=native を使用します
  • opt-bounds-check - ホットパスで境界チェックをなくせるイテレーターやパターンを使用します
  • opt-simd-portable - アーキテクチャを問わずベクトル化演算を行うには、ポータブル SIMD を使用します
  • opt-cache-friendly - キャッシュ効率の高いアクセスパターンになるよう、データを整理します
9. 数値と算術の安全性(HIGH)
  • num-overflow-explicit - 整数オーバーフローを明示的に処理します:checked_/saturating_/wrapping_/overflowing_
  • num-cast-try-from - 縮小キャストに as を使用せず、拡大には From、縮小には TryFrom を使用します
  • num-float-compare - 浮動小数点数を == で比較せず、許容誤差を使用します。順序付けには total_cmp を使用します
  • num-saturating-clamp - clamp と飽和算術で値を範囲内に収めます
  • num-nonzero - ゼロを禁止し、ニッチ最適化を利用するには NonZero* 型を使用します
10. 型の安全性(MEDIUM)
  • type-newtype-ids - ID を新しい型でラップします:UserId(u64)
  • type-newtype-validated - 構築時に検証を強制するには、新しい型を使用します
  • type-enum-states - 相互に排他的な状態には列挙型を使用します
  • type-option-nullable - 値が存在しない可能性がある場合は Option<T> を使用します
  • type-result-fallible - 失敗する可能性のある操作には Result<T, E> を使用します
  • type-phantom-marker - 実行時コストなしに型の関係を表すには PhantomData を使用します
  • type-never-diverge - 戻ることのない関数には !(never 型)を使用します
  • type-generic-bounds - トレイト境界は必要な箇所にのみ追加し、読みやすさのために where 句を優先します
  • type-no-stringly - 文字列型 API を避け、列挙型、新しい型、または検証済みの型を使用します
  • type-repr-transparent - FFI コンテキストで新しい型を使用する場合は #[repr(transparent)] を使用します
  • type-deref-coercion - Deref/DerefMut はスマートポインター型と透過的なラッパー型にのみ実装します
  • type-display-vs-debug - ユーザー向け出力には Display、診断には Debug を使用し、決して入れ替えないでください
  • type-numeric-fmt - 数値の新しい型には LowerHex、UpperHex、Octal、Binary を実装します
11. トレイトとジェネリクスの設計(MEDIUM)
  • trait-associated-type-vs-generic - 各実装の出力型が必ず1つだけの場合は関連型を使用し、型が複数の入力型に対してトレイトを実装できる場合はジェネリックパラメーターを使用します
  • trait-blanket-impl - 境界を満たすすべての型に動作を提供するには、ブランケット実装 impl<T: Bound> Trait for T を使用します
  • trait-coherence-newtype - オーファンルールを守り、外部トレイトを外部型に実装するには、その型をニュータイプでラップします
  • trait-default-methods - 必須メソッドを少数定義し、それらを基にしたデフォルト実装のメソッドを追加してトレイトを定義します
  • trait-dyn-vs-generic - 静的ディスパッチ(ジェネリクス/impl Trait)と動的ディスパッチ(dyn Trait)を意図的に選択します
  • trait-object-safety - dyn Trait が必要な場合は、トレイトを dyn 互換(オブジェクトセーフ)に保ちます
12. 変換(MEDIUM)
  • conv-tryfrom-fallible - 失敗する可能性がある変換には、個別の変換関数ではなく TryFrom を実装します
  • conv-fromstr-parsing - 文字列から型への変換で str::parse を使えるようにするには、FromStr を実装します
  • conv-asmut-mutable - 具体的な可変参照ではなく impl AsMut<T> を受け入れ、可変の借用入力に柔軟に対応します
13. 定数とコンパイル時処理(MEDIUM)
  • const-block - コンパイル時の評価やアサーションには、インラインの const { } ブロックを使用します
  • const-fn - コンパイル時に実行できる関数は const fn にします
  • const-generics - const ジェネリクス <const N: usize> で値をパラメーター化します
  • const-vs-static - インライン化される値には const を、アドレスが1つのインスタンスには static を使用します
14. Serde(MEDIUM)
  • serde-rename-all - #[serde(rename_all = ...)] で外部の命名規則に合わせます
  • serde-default-compat - 任意のフィールドや後方互換性が必要なフィールドには #[serde(default)] を使用します
  • serde-skip-empty - skip_serializing_if で空のフィールドを省略します
  • serde-flatten - #[serde(flatten)] でネストされた構造体をインライン化するか、追加のキーを取り込みます
  • serde-enum-representation - 列挙型のタグ付け方法(外部タグ、内部タグ、隣接タグ、タグなし)を意図的に選択します
  • serde-deny-unknown-fields - #[serde(deny_unknown_fields)] で予期しないキーを拒否します
  • serde-custom-with - with/serialize_with/deserialize_with でフィールドのシリアライズ/デシリアライズをカスタマイズします
  • serde-try-from-validate - #[serde(try_from = "Raw")] でデシリアライズ時に検証します
15. パターンマッチング(MEDIUM)
  • pat-let-else - パターンを取り出して早期リターンするには let ... else を使用します
  • pat-matches-macro - ブール値を返すパターン判定には matches!() を使用します
  • pat-if-let-chains - if let チェーンでパターンの束縛と条件を組み合わせます
  • pat-exhaustive-enum - 所有する列挙型を漏れなくマッチさせ、新しいバリアントを隠してしまう包括的な _ は避けます
  • pat-at-bindings - @ 束縛を使用し、値をパターンと照合しながらその値をキャプチャします
16. マクロ(MEDIUM)
  • macro-prefer-functions - 関数やジェネリックでは表現できない場合にのみ、マクロを使います
  • macro-rules-hygiene - macro_rules! の衛生性を活用し、自クレートのアイテムへのパスには $crate を使います
  • macro-fragment-specifiers - 可能な場合は、生の :tt ではなく、正確なフラグメント指定子でキャプチャします
  • macro-export-crate-path - #[macro_export] を使って宣言的マクロをエクスポートし、明確なインポートパスを用意します
  • macro-private-helpers - マクロが生成するヘルパーアイテムを #[doc(hidden)] pub mod __private の背後に隠します
  • macro-proc-two-crate - 手続き型マクロを専用の proc-macro = true クレートに配置し、ファサードから再エクスポートします
  • macro-proc-syn-quote - syn、quote、proc-macro2 を使って手続き型マクロを構築します
  • macro-proc-error-spans - 手続き型マクロのエラーはスパン付きのコンパイルエラーとして報告し、決してパニックさせません
17. クロージャ(MEDIUM)
  • closure-fn-trait-bounds - コールバックに必要な最も制約の少ない Fn トレイトを要求します(FnOnce ⊇ FnMut ⊇ Fn)
  • closure-impl-fn-return - クロージャは Box<dyn Fn> ではなく、impl Fn/FnMut/FnOnce として返します
  • closure-move-capture - 現在のスコープより長く存続するクロージャには move を使います。元の値を保持するには、move の前にクローンします
  • closure-static-vs-dyn - ホットなコールバックには impl Fn(ジェネリック)を受け取り、コードサイズを削減したり、格納したりする場合は &dyn Fn/Box<dyn Fn> を使います
  • closure-disjoint-capture - 使用するものだけをキャプチャし、エディション 2021 のクロージャにおけるフィールド単位のキャプチャを活用します
18. コレクション(MEDIUM)
  • coll-binaryheap - 優先度付きキューや、最大値の繰り返し取り出しには BinaryHeap を使います
  • coll-map-choice - アクセスパターンに応じてマップを選びます。高速で順序なしの HashMap、ソート済み/範囲検索用の BTreeMap、挿入順を保持する IndexMap を使います
  • coll-seq-choice - 通常は Vec を使います。キュー/デックの動作には VecDeque を使い、LinkedList は避けます
  • coll-set-membership - 要素の有無の判定や重複排除には Vec::contains による線形検索ではなく、HashSet/BTreeSet を使います
19. 命名規則(MEDIUM)
  • name-types-camel - 型、トレイト、列挙型の名前にはUpperCamelCaseを使用します
  • name-variants-camel - 列挙型のバリアントにはUpperCamelCaseを使用します
  • name-funcs-snake - 関数、メソッド、変数、モジュールにはsnake_caseを使用します
  • name-consts-screaming - 定数と静的変数にはSCREAMING_SNAKE_CASEを使用します
  • name-lifetime-short - 短く慣例的なライフタイム名を使用します:'a、'b、'de、'src
  • name-type-param-single - 型パラメーターには大文字1文字を使用します:T、E、K、V
  • name-as-free - as_接頭辞:所有権を伴わない参照変換
  • name-to-expensive - 割り当てや計算を伴うコストの高い変換にはto_接頭辞を使用します
  • name-into-ownership - 所有権を消費する変換にはinto_接頭辞を使用します
  • name-no-get-prefix - 単純なゲッターではget_接頭辞を省略します
  • name-is-has-bool - ブール値を返すメソッドにはis_、has_、can_、should_接頭辞を使用します
  • name-iter-convention - イテレータメソッドにはiter/iter_mut/into_iterを使用します
  • name-iter-method - イテレータメソッドには一貫してiter()、iter_mut()、into_iter()という名前を付けます
  • name-iter-type-match - イテレータ型には、元となるメソッドに基づいた名前を付けます
  • name-acronym-word - 識別子では頭字語を単語として扱います:HTTPServerではなくHttpServer
  • name-crate-no-rs - クレート名に-rsや-rustを付けないでください
20. テスト(MEDIUM)
  • test-cfg-test-module - 各モジュール内の#[cfg(test)] mod tests { }にユニットテストを配置します
  • test-use-super - テストモジュールではuse super::*;を使用して親モジュールの項目にアクセスします
  • test-integration-dir - 統合テストはtests/ディレクトリに配置します
  • test-descriptive-names - テスト内容が分かる、説明的な名前を付けます
  • test-arrange-act-assert - Arrange、Act、Assertの各セクションを明確にしてテストを構成します
  • test-proptest-properties - プロパティベーステストにはproptestを使用します
  • test-mockall-mocking - トレイトのモックにはmockallを使用します
  • test-mock-traits - テストでモックを利用できるよう、依存関係にはトレイトを使用します
  • test-fixture-raii - テストを自動的にクリーンアップするにはRAIIパターン(Dropトレイト)を使用します
  • test-tokio-async - 非同期テストには#[tokio::test]を使用します
  • test-should-panic - コードが想定どおりにパニックすることをテストするには#[should_panic]を使用します
  • test-criterion-bench - ベンチマークにはcriterionを使用します
  • test-doctest-examples - ドキュメントの例は、実行可能なドキュメントテストとして維持します
  • test-loom-concurrency - ロックフリーコードや並行コードを網羅的にテストするにはloomを使用します
  • test-snapshot-testing - 複雑な出力やシリアライズされた出力にはスナップショットテスト(insta)を使用します
21. ドキュメント(MEDIUM)
  • doc-all-public - すべての公開項目に /// のドキュメントコメントを記述します
  • doc-module-inner - モジュールレベルのドキュメントには //! を使用します
  • doc-examples-section - 実行可能なコードを含む # Examples を記述します
  • doc-errors-section - 失敗する可能性がある関数には # Errors セクションを記述します
  • doc-panics-section - パニックを起こす可能性がある関数には # Panics セクションを記述します
  • doc-safety-section - unsafe 関数には # Safety セクションを記述します
  • doc-question-mark - 例では .unwrap() ではなく ? を使用します
  • doc-hidden-setup - 例のセットアップコードを非表示にするには # 接頭辞を使用します
  • doc-intra-links - 型や項目への参照にはドキュメント内リンクを使用します
  • doc-link-types - 関連する型や関数をつなぐにはドキュメント内リンクを使用します
  • doc-cargo-metadata - 公開するクレートの Cargo.toml メタデータを設定します
  • doc-crate-readme - #![doc = include_str!("../README.md")] を使用して、README とクレートルートのドキュメントを統一します
22. 可観測性(MEDIUM)
  • obs-tracing-over-log - println! や単純な log の代わりに、構造化され、スパンを認識する診断情報には tracing を使用します
  • obs-library-facade - ライブラリは tracing/log ファサードを介して出力し、サブスクライバーをインストールしません
  • obs-structured-fields - メッセージ文字列に値を埋め込むのではなく、構造化されたキーと値のフィールドを記録します
  • obs-instrument-spans - #[tracing::instrument] とスパンを使用して、非同期タスクやリクエストにコンテキストを付与します
  • obs-levels-filter - ログレベルを適切に使用し、EnvFilter / RUST_LOG でフィルタリングします
  • obs-error-chain - エラーは原因のチェーン全体とともにログに記録し、各エラーを一度だけ記録します
  • obs-no-sensitive-data - シークレットや PII は決してログに記録せず、マスキングするか省略します
23. パフォーマンスパターン(MEDIUM)
  • perf-iter-over-index - 手動のインデックス操作よりイテレーターを優先します
  • perf-iter-lazy - イテレーターは遅延評価のままにし、必要な場合にのみ収集します
  • perf-collect-once - 中間イテレーターを収集しないでください
  • perf-entry-api - マップの挿入または更新には entry API を使用します
  • perf-drain-reuse - drain を使用して割り当てを再利用します
  • perf-extend-batch - 一括挿入には extend を使用します
  • perf-chain-avoid - ホットループでは chain を避けます
  • perf-collect-into - コンテナーを再利用するには collect_into を使用します
  • perf-black-box-bench - ベンチマークでは black_box を使用します
  • perf-release-profile - リリースプロファイルの設定を最適化します
  • perf-profile-first - 最適化の前にプロファイリングを行います
  • perf-ahash - DoS 耐性が不要な場合は、より高速なハッシャー(ahash / FxHashMap)を使用します
  • perf-io-buffering - 小さな操作を多数行う場合は、Read/Write を BufReader/BufWriter でラップします
24. プロジェクト構成(低)
  • proj-lib-main-split - main.rs を最小限に保ち、ロジックは lib.rs に置きます
  • proj-mod-by-feature - 型ではなく機能ごとにモジュールを整理します
  • proj-flat-small - 小規模なプロジェクトはフラットな構成にします
  • proj-mod-rs-dir - 複数ファイルからなるモジュールには mod.rs を使用します
  • proj-pub-crate-internal - 内部 API には pub(crate) を使用します
  • proj-pub-super-parent - 親モジュールからのみ参照可能にするには pub(super) を使用します
  • proj-pub-use-reexport - 明確な公開 API を提供するには pub use を使用します
  • proj-prelude-module - 共通のインポート用に prelude モジュールを作成します
  • proj-bin-dir - 複数のバイナリは src/bin/ に配置します
  • proj-workspace-large - 大規模なプロジェクトではワークスペースを使用します
  • proj-workspace-deps - クレート間でバージョンを統一するには、ワークスペースの依存関係の継承を使用します
  • proj-feature-additive - Cargo の機能は厳密に追加的になるよう設計します
  • proj-msrv-declare - Cargo.toml で rust-version(MSRV)を宣言し、CI でテストします
  • proj-build-rs-minimal - build.rs は最小限かつ決定的で、冪等性を保ちます
25. Clippy とリンティング(低)
  • lint-deny-correctness - #![deny(clippy::correctness)]
  • lint-warn-suspicious - バグの可能性が高いコードを検出するため、clippy::suspicious を有効にします
  • lint-warn-style - 慣用的なコードにするため、clippy::style を有効にします
  • lint-warn-complexity - コードを簡潔にするため、clippy::complexity を有効にします
  • lint-warn-perf - パフォーマンスを改善するため、clippy::perf を有効にします
  • lint-pedantic-selective - clippy::pedantic を選択的に有効にします
  • lint-missing-docs - 公開項目のドキュメントが不足している場合に警告します
  • lint-unsafe-doc - unsafe ブロックにドキュメントを必須にします
  • lint-cargo-metadata - 公開するクレートでは clippy::cargo を有効にします
  • lint-rustfmt-check - CI で cargo fmt --check を実行します
  • lint-workspace-lints - 一貫して適用するため、ワークスペースレベルでリンティングを設定します
  • lint-cfg-check - 機能ゲートの誤記を検出するため、unexpected_cfgs を有効にし、既知の cfg を宣言します
  • lint-clippy-nursery-selected - clippy::nursery の価値の高いリンティングを選択的に有効にし、グループ全体は有効にしません
26. アンチパターン(参考)

推奨される Cargo.toml 設定

[profile.release]
opt-level = 3
lto = "fat"
codegen-units = 1
panic = "abort"
strip = true

[profile.bench]
inherits = "release"
debug = true
strip = false

[profile.dev]
opt-level = 0
debug = true

[profile.dev.package."*"]
opt-level = 3  # Optimize dependencies in dev

使用方法

このスキルでは、すぐに参照できるルール識別子を提供します。Rust コードを生成またはレビューする際は、次の手順に従ってください。

  1. タスクの種類に応じて、関連するカテゴリを確認します
  2. 一致するプレフィックスのルールを適用します
  3. 優先順位を付けます(CRITICAL > HIGH > MEDIUM > LOW)
  4. 詳細な例については、rules/ 内のルールファイルを確認します
タスク別のルール適用
タスク主なカテゴリ
新しい関数own-、err-、name-、pat-
新しい構造体/APIapi-、type-、conv-、doc-
非同期コードasync-、own-
並行処理/並列処理conc-、async-、own-
unsafe コードunsafe-、type-、test-
エラー処理err-、api-、pat-
型変換conv-、api-
シリアライズ(serde)serde-、type-、api-
数値/算術演算num-、type-
マクロ/コード生成macro-、anti-
クロージャー/コールバックclosure-、type-
ロギング/可観測性obs-、err-
メモリ最適化mem-、own-、perf-
パフォーマンス調整opt-、mem-、perf-
コードレビューanti-、lint-

出典と帰属

このスキルは、Rust の公式ガイダンス、定評のある書籍、および広く使われているクレートのパターンを独自にまとめたものです。Rust プロジェクトやクレートの作者とは提携しておらず、推奨も受けていません。本文とコード例はオリジナルです。

Rust の公式ドキュメント

書籍とガイド

ツール

イディオムの参考として調査した実際のコードベース

  • ripgrep、tokio、serde、clap、polars、axum、cargo、hyper、bevy、rayon、および dtolnay のクレート(thiserror、anyhow、syn)

このプロジェクトは MIT ライセンスです。参照先の上流資料は、それぞれ独自のライセンスで提供されています(Rust の公式ドキュメントと API Guidelines は MIT / Apache-2.0 のデュアルライセンスです)。

コメント