Dev Study
← 解説「Box<T> — ヒープにデータを置く」に戻る

サンプルコードで身につける: Box<T> — ヒープにデータを置く

解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1最小の Box — 値をヒープに置く

Box::new で値をヒープに移し、* で中身に届く、いちばん素朴な例です。変数 a や b が持っているのは「ヒープ上の値の置き場所を指すポインタ」だけで、* を付ければ普通の値と同じように計算に使えます。まずは「箱に入れて、* で開ける」という往復の感覚をつかんでください。

Rust

2Box の所有権 — 普通の値と同じようにムーブする

Box も所有権のルールにそのまま従うことを示す例です。関数に渡すと Box ごとムーブし、関数が終わった時点で所有者が消えるので、ヒープのデータも自動で解放されます。メソッドが . でそのまま呼べる点も含めて、「使い心地は普通の値、置き場所だけヒープ」が Box の基本です。

Rust

3大きなデータの受け渡し — 動くのはポインタだけ

1000 バイトの配列をヒープに置き、変数間の移動ではポインタしか動かないことを示す例です。スタック上の大きな配列をそのまま代入すると中身が丸ごとコピーされますが、Box ならどれだけ大きなデータでもムーブのコストは一定です。画像データや巨大な構造体を関数間で受け渡す場面で効いてきます。

Rust

4再帰的な enum — Box でサイズを確定させる

自分自身を含む enum は「サイズが無限」になるため定義できませんが、Box を挟むと「ポインタ1個分」にサイズが確定して定義できます。Box の代表的な使いどころで、連結リストや構文木のような再帰的データ構造はこの形で作ります。match と再帰関数で全要素をたどれることも確認してください。

Rust

5カテゴリ階層 — Option<Box<T>> で親をたどる

EC サイトの商品カテゴリのような「親を持つかもしれない階層構造」を Option<Box<Category>> で表す実務寄りの例です。「親がいないなら None、いるならヒープ上の親を指す」という形で、深さが実行時に決まる木構造を表現できます。再帰関数で親をたどってフルパスを組み立てています。

Rust