m02-resource について
m02-resourceは、所有権とスマートポインターのパターンを選ぶRust開発者向けの学習スキルです。単独・共有所有権、スレッド環境、循環参照、メモリー確保の必要性を検討できます。
主な機能
- 01所有権パターンの判断問い
- 02Box、Rc、Arcの使用指針
- 03スレッド環境別のポインター比較
- 04循環参照向けWeak参照
- 05よくあるリソースエラーの案内
活用シーン
- 01共有データ用ポインターの選択
- 02循環参照によるメモリーリークの防止
- 03ヒープ確保が必要かの判断
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ actionbook/ rust-skills --skill m02-resourceインストール後、Claude Code で/m02-resourceを入力して読み込まれたか確認します。
詳細
リソース管理
レイヤー 1:言語の仕組み
基本的な問い
このリソースにはどの所有パターンが必要ですか?
スマートポインターを選ぶ前に、次の点を確認してください。
- 所有者は単一ですか、それとも共有されますか?
- アクセスは単一スレッドですか、それともマルチスレッドですか?
- 循環参照が発生する可能性はありますか?
エラー → 設計上の問い
| エラー | ただ言うだけではなく | 代わりに尋ねる |
|---|---|---|
| 「ヒープ割り当てが必要」 | 「Box を使う」 | なぜスタックに置けないのですか? |
| Rc のメモリリーク | 「Weak を使う」 | 設計上、その循環参照は必要ですか? |
| RefCell のパニック | 「try_borrow を使う」 | 実行時チェックは適切な方法ですか? |
| Arc のオーバーヘッドへの不満 | 「受け入れる」 | 本当にマルチスレッドアクセスが必要ですか? |
考えるためのプロンプト
スマートポインターを選ぶ前に、次の点を確認してください。
-
所有モデルはどのようなものですか?
- 単一所有者 → Box または所有値
- 共有所有 → Rc/Arc
- 弱参照 → Weak
-
スレッドの状況はどうなっていますか?
- シングルスレッド → Rc、Cell、RefCell
- マルチスレッド → Arc、Mutex、RwLock
-
循環参照はありますか?
- はい → 一方向は Weak にする必要があります
- いいえ → 通常の Rc/Arc で問題ありません
上へたどる ↑
ポインターの選択がはっきりしない場合は、設計までたどってください。
"Should I use Arc or Rc?"
↑ Ask: Is this data shared across threads?
↑ Check: m07-concurrency (thread model)
↑ Check: domain-* (performance constraints)
| 状況 | たどる先 | 質問 |
|---|---|---|
| Rc と Arc のどちらにするか迷う | m07-concurrency | 並行処理モデルはどのようなものですか? |
| RefCell のパニック | m03-mutability | ここで内部可変性を使うのは適切ですか? |
| メモリリーク | m12-lifecycle | クリーンアップはどこで行うべきですか? |
下へたどる ↓
設計から実装へ:
"Need single-owner heap data"
↓ Use: Box<T>
"Need shared immutable data (single-thread)"
↓ Use: Rc<T>
"Need shared immutable data (multi-thread)"
↓ Use: Arc<T>
"Need to break reference cycle"
↓ Use: Weak<T>
"Need shared mutable data"
↓ Single-thread: Rc<RefCell<T>>
↓ Multi-thread: Arc<Mutex<T>> or Arc<RwLock<T>>
クイックリファレンス
| 型 | 所有権 | スレッドセーフ | 使用する場面 |
|---|---|---|---|
Box<T> | 単一 | はい | ヒープ割り当て、再帰型 |
Rc<T> | 共有 | いいえ | シングルスレッドでの共有所有 |
Arc<T> | 共有 | はい | マルチスレッドでの共有所有 |
Weak<T> | 弱参照 | Rc/Arc と同じ | 参照サイクルを断つ |
Cell<T> | 単一 | いいえ | 内部可変性(Copy 型) |
RefCell<T> | 単一 | いいえ | 内部可変性(実行時チェック) |
判断フローチャート
Need heap allocation?
├─ Yes → Single owner?
│ ├─ Yes → Box<T>
│ └─ No → Multi-thread?
│ ├─ Yes → Arc<T>
│ └─ No → Rc<T>
└─ No → Stack allocation (default)
Have reference cycles?
├─ Yes → Use Weak for one direction
└─ No → Regular Rc/Arc
Need interior mutability?
├─ Yes → Thread-safe needed?
│ ├─ Yes → Mutex<T> or RwLock<T>
│ └─ No → T: Copy? → Cell<T> : RefCell<T>
└─ No → Use &mut T
よくあるエラー
| 問題 | 原因 | 修正方法 |
|---|---|---|
| Rc の循環参照によるリーク | 相互に強参照している | 一方向に Weak を使う |
| RefCell のパニック | 実行時の借用競合 | try_borrow を使うか、構成を見直す |
| Arc のオーバーヘッド | ホットパスでのアトミック操作 | シングルスレッドなら Rc を検討する |
| Box が不要 | データがスタックに収まる | Box を取り除く |
アンチパターン
| アンチパターン | 問題点 | より良い方法 |
|---|---|---|
| どこでも Arc を使う | 不要なアトミック操作のオーバーヘッド | シングルスレッドでは Rc を使う |
| どこでも RefCell を使う | 実行時パニック | 所有関係を明確に設計する |
| 小さな型に Box を使う | 不要な割り当て | スタック割り当て |
| 循環参照で Weak を使わない | メモリリーク | Weak を使った親子関係を設計する |
関連スキル
| 場合 | 参照先 |
|---|---|
| 所有権エラー | m01-ownership |
| 内部可変性の詳細 | m03-mutability |
| マルチスレッドの状況 | m07-concurrency |
| リソースのライフサイクル | m12-lifecycle |
コメント
Markdown 対応