← 解説「Rc<T> — 所有者を複数にする」に戻る
サンプルコードで身につける: Rc<T> — 所有者を複数にする
解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。
1最小の Rc — clone しても中身は1つ
Rc::new で包んだ値を Rc::clone で共有する最小の例です。clone という名前ですが中身の String は複製されず、「所有者の数」が1増えるだけです。今何人で共有しているかは Rc::strong_count でいつでも確認できます。
Rust
2関数にはクローンを渡す — 元の所有権は手元に残る
Rc::clone を渡せば、関数に所有権を「分け与え」つつ元の変数も使い続けられることを示す例です。普通のムーブと違って何度でも渡せて、関数が終わるたびに所有者が1人減ります。「渡した先がいつまで使うか分からないデータ」を共有する基本パターンです。
Rust
3リストの末尾を共有 — Box では書けない形
2本のリスト a と b が同じ末尾 shared を共有する、Rc の動機がいちばん分かる例です。Box は所有者が1人なので、同じ末尾を2本のリストにつなぐことができません。グラフ構造のように「複数の場所から同じノードを指す」設計は Rc で初めて表現できます。
Rust
4複数の構造体で同じドキュメントを共有
2つの Viewer が同じ本文データを Rc<String> のフィールドとして持つ例です。大きなテキストを画面ごとに clone で複製すると無駄が大きいですが、Rc なら実体は1つのままです。「どの Viewer が最後まで生きるか分からない」状況でも、最後の所有者が消えた時点で自動解放されます。
Rust
5設定の共有 — サービスが終了しても設定は生きる
アプリ全体の設定 Config を複数のサービスで共有する実務寄りの例です。drop(api) でサービスを1つ終了させても、他の所有者が残っている限り設定データは解放されません。「全員が使い終わったときだけ解放する」という管理を、参照カウントが自動でやってくれます。
Rust