rust-ownership-borrowing について
プログラムのデータフローに合った所有権と借用を設計する Rust スキルです。値の寿命、アクセス、変更、共有所有権を検討する手順を示します。
主な機能
- 01値の所有者とアクセス要件の特定
- 02所有または借用する関数引数の選択
- 03変更前に借用範囲を短縮
- 04移動とクローンの意図的な利用
- 05共有所有権と内部可変性の設計
- 06ライフタイムと所有権の不変条件の確認
活用シーン
- 01借用チェッカーエラーの解決
- 02借用の多い変更のレビュー
- 03関数引数の型選択
- 04自己参照またはグラフ状データの再構成
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ lvtd-llc/ skills --skill rust-ownership-borrowingインストール後、Claude Code で/rust-ownership-borrowingを入力して読み込まれたか確認します。
同梱ファイルagents/openai.yamlreferences/borrow-patterns.md
詳細
Rust の所有権と借用
このスキルを使って、所有権の形をプログラムのデータフローに合わせます。借用チェッカーのエラーは設計へのフィードバックとして扱い、各値の所有者、アクセスが必要な期間、変更に排他性が必要か別のデータ構造が必要かを判断します。
基本的なワークフロー
- エラーが発生しているコードパスを通る各値の所有者を特定します。
- 各関数に必要なアクセス方法(所有、共有借用、可変借用、共有所有権)を判断します。
- 型を変更する前に、借用のスコープを短くします。ブロック、一時値、ヘルパー関数、早めの値の取り出しなどを導入し、変更前に参照が終了するようにします。
- 呼び出し元がその後値を使わない場合は、値を移動することを優先します。呼び出し元が所有権を保持する場合は、借用を優先します。重複した所有権が意図され、コストが許容できる場合に限りクローンします。
Rc<RefCell<_>>に頼る前に、自己参照型やグラフ状の設計を ID、インデックス、アリーナ、所有権ツリーに置き換えます。- 単一スレッドでの共有所有権には
Rc、スレッド間での共有所有権にはArcを使います。Cell、RefCell、Mutex、RwLockを追加するのは、変更モデルが明確な場合に限ります。 - 変更のきっかけとなったコンパイラーエラーだけでなく、所有権に関わる動作を検証するテストを追加します。
シグネチャのルール
- 関数が値を消費する、または保存する場合は
Tを受け取ります。 - 関数の呼び出し中に読み取るだけの場合は
&Tを受け取ります。 - 関数で変更が必要で、ほかのアクセスを許可すべきでない場合は
&mut Tを受け取ります。 - 返す参照が入力のライフタイムに明確に結び付いている場合を除き、所有値を返します。
- 必要な機能を
&[T]、&str、&Pathで表現できる場合は、&Vec<T>、&String、&PathBufの受け取りを避けます。 - 構造体がほかで所有されているデータを実際に借用するのでない限り、構造体にライフタイムパラメーターを追加しないでください。通常、所有フィールドのほうがシンプルです。
よくある修正パターン
複雑なコンパイラーエラーの解決や、借用の多いパッチのレビューでは、references/borrow-patterns.md を読んでください。
- 可変借用を取る前に、不変借用のスコープを狭めます。
Option::take、std::mem::take、std::mem::replaceを使い、妥当な値を残したままフィールドを移動します。- 重複する借用を生じさせるインデックス操作のパターンではなく、
split_at_mut、get_mut、entry、drain、retainなどのコレクション API を使います。 Arc、Rc、低コストの ID などのハンドルは、それが意図した所有権ハンドルであれば自由にクローンします。コンパイラーを黙らせるためにペイロードをクローンすることは避けます。- イテレーターのチェーンを明示的なループに変えるのは、借用のライフタイムが明確になる場合、または暗黙のキャプチャを避けられる場合に限ります。
レビューチェックリスト
- 所有権がドメインモデルに沿っており、借用チェッカーを回避するためだけに型をラップしていません。
Cloneの使用が意図的であり、該当する場合は意味上の独立性がテストされています。- 内部可変性に明確な不変条件があり、アクセス範囲が小さく保たれています。
- ライフタイムが実際の借用関係を表しており、コンパイラーに受け入れられるまで推測で追加したものではありません。
- 非同期コードやスレッドを使うコードでは、
Arcと適切な同期プリミティブを使っています。RcとRefCellはスレッド間の処理経路では使いません。
コメント
Markdown 対応