Dev Study
← 解説「可変参照 — &mut T」に戻る

サンプルコードで身につける: 可変参照 — &mut T

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

1&mut で借りた値を書き換える

let mut の String に &mut で可変参照を作り、push_str で本体を書き換える最小の例です。最後の println! では持ち主の message から、変更が反映された値が読めています。「貸し先での変更が本体に及ぶ」のが、読み取り専用の & との決定的な違いです。

Rust

2関数に &mut を渡して書き換えてもらう

引数を &mut String で受ける関数に渡すと、呼び出し元の変数が直接書き換わる、という可変参照の実用形です。値を返してもらって入れ直す方式と違い、所有権は一度も手放していません。「加工は関数に任せ、データは手元に置いたまま」という分業がこの形で実現します。

Rust

3可変参照は同時に1つだけ

r1 を使い終えてから r2 を作れば連続して借用できるが、同時に2つの &mut は作れない、というルールを示す例です。コメントの2行を同時に生かすとコンパイルエラーになります。「書き換え中のデータに他から触らせない」ことで、データ競合をコンパイル時に締め出しています。

Rust

4数値は * で参照先に書き込む

i32 のような数値を &mut で借りた場合は、*score のようにアスタリスクを付けて「参照先の中身」に書き込む、という例です。String のメソッド呼び出しでは隠れていた「参照を経由して本体を触る」操作が、ここでは * として目に見えます。スコアやカウンタを関数で更新する場面の基本形です。

Rust

5在庫数の更新で見る可変参照

1つの在庫数を、入荷の restock と販売の sell という2つの関数が &mut で借りて更新していく実務寄りの例です。sell は *stock を読んで在庫不足を判定してから書き換えており、読み書き両方に可変参照を使っています。「状態は1か所、更新ロジックは関数に分割」という実務の構造を、可変参照が支えています。

Rust