Dev Study
← 解説「構造体に参照を持たせる」に戻る

サンプルコードで身につける: 構造体に参照を持たせる

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

1参照を1つ持つ最小の構造体

&str のフィールドを1つだけ持つ、参照を抱える構造体の最小例です。struct Label<'a> の <'a> は「Label は借り物を持っているので、貸し主より長生きできない」という宣言です。文字列を所有していないので、構築後も元の message をそのまま使えます。

Rust

2インスタンスは元データより長生きできない

参照を持つ構造体のインスタンスが、元データとどちらが長生きするかで合否が分かれることを示す例です。外の値を借りて内側のブロックで使うのは安全ですが、逆はコンパイルエラーになります。関数のライフタイムと同じルールが、構造体にもそのまま当てはまることを確認してください。

Rust

31つの文字列から複数のフィールドを借りる

1行のログ文字列から、レベルとメッセージの2か所をスライスで切り出して1つの構造体に持たせる例です。両フィールドが同じ line を借りているので、ライフタイムパラメータは 'a を1つ共有すれば足ります。元の String を複製せずに「構造化された見方」だけを作れるのが参照フィールドの強みです。

Rust

4impl<'a> でメソッドを付ける

参照を持つ構造体に impl を書くときは、impl<'a> Excerpt<'a> とパラメータを繰り返すことを示す例です。new のような関連関数も char_count のようなメソッドも、普通の構造体と同じ感覚で書けます。長い文章から抜粋だけを借りて分析する、という使い方は文字列処理の実務でよく登場します。

Rust

5設定行パーサ — 借用したまま構造化する

host=localhost のような設定行を、複製せずに key と value へ分解して返す実務寄りの例です。関数の <'a> と構造体の <'a> をつなげることで、「返した ConfigEntry は入力の line が生きている間だけ有効」という関係が型で保証されます。大量の行を処理してもコピーが発生しない、参照フィールドらしい設計です。

Rust