// dictionary
借用.
参照を作って値を「借りる」という仕組みや行為のことを借用(Borrowing)と呼びます。借用には共有参照を作ることで発生する共有借用と、排他参照を作ることで発生する排他借用の2つに分けられます。
借用規則
コンパイラはすべての借用が次のルールを守ることをコンパイル時に検査し、違反はコンパイルエラーにします。
- 共有参照は同時にいくつでも持てる(
&Tの共有性) - 排他参照は同時に1つしか持てない(
&mut Tの排他性) - 共有参照と排他参照は同時に存在できない(
&mut Tの排他性) - 参照は常に有効な値を指していなければならない(ダングリング参照不可)
借用はいつまで続くか
借用は、NLL(非レキシカルライフタイム)に基づいた有効範囲内まで続きます。ただし、参照を保持している値が、デストラクタでその参照を使用しうる形でDropトレイトを実装している場合は、スコープ終端でのデストラクタ実行も「使用」とみなされ、借用はそこまで延長されます。この検査を行うコンパイラの仕組みは借用チェッカーと呼ばれます。
所有者側の制約
借用が有効な期間内において、その借用元の所有者側は共有借用と排他借用で以下のような制約があります。
- 共有借用が有効な状態:所有者側が値を変更することはできない。(内部可変性パターンのデータ型を除く)
- 排他借用が有効な状態:所有者側は値の変更も読み取りもできない。
補足
メソッド呼び出しにおける借用について
メソッド呼び出しでは排他借用が自動で行われます。たとえばitems.push(value)は(&mut items).push(value)とほぼ同等で、&mutを書かなくてもitemsの排他借用が発生しています。
この辞書が使われているページ
backlinks 14