Progrust Library.

// dictionary

借用.

参照を作って値を「借りる」という仕組みや行為のことを借用(Borrowing)と呼びます。借用には共有参照を作ることで発生する共有借用と、排他参照を作ることで発生する排他借用の2つに分けられます。

借用規則

コンパイラはすべての借用が次のルールを守ることをコンパイル時に検査し、違反はコンパイルエラーにします。

  1. 共有参照は同時にいくつでも持てる(&Tの共有性)
  2. 排他参照は同時に1つしか持てない(&mut Tの排他性)
  3. 共有参照と排他参照は同時に存在できない(&mut Tの排他性)
  4. 参照は常に有効な値を指していなければならない(ダングリング参照不可)

借用はいつまで続くか

借用は、NLL(非レキシカルライフタイム)に基づいた有効範囲内まで続きます。ただし、参照を保持している値が、デストラクタでその参照を使用しうる形でDropトレイトを実装している場合は、スコープ終端でのデストラクタ実行も「使用」とみなされ、借用はそこまで延長されます。この検査を行うコンパイラの仕組みが借用チェッカーです。

所有者側の制約

借用が有効な期間内において、その借用元の所有者側は共有借用と排他借用で以下のような制約があります。

  • 共有借用が有効な状態:所有者側が値を変更することはできない。(内部可変性パターンのデータ型を除く)
  • 排他借用が有効な状態:所有者側は値の変更も読み取りもできない。

補足

メソッド呼び出しにおける借用について

メソッド呼び出しでは排他借用が自動で行われます。たとえばitems.push(value)は(&mut items).push(value)とほぼ同等で、&mutを書かなくてもitemsの排他借用が発生しています。

この辞書が使われているページ

backlinks 26

  1. 辞書Copyトレイト
  2. 辞書Debugトレイト
  3. 辞書Defaultトレイト
  4. 辞書NLL(非レキシカルライフタイム)
  5. 辞書クローン
  6. 辞書スコープ
  7. 辞書スライス
  8. 辞書ダングリング参照
  9. 辞書ムーブ
  10. 辞書ライフタイム
  11. 辞書ライフタイム注釈
  12. 辞書演算子オーバーロード
  13. 辞書可変性
  14. 辞書参照
  15. 辞書自動参照・自動参照外し
  16. 辞書借用チェッカー
  17. 辞書所有権
  18. 辞書静的変数
  19. 辞書比較演算子
  20. 辞書文字列スライス
  21. 辞書文字列型
  22. 辞書包括パターン
  23. 本動かして学ぶRustプログラミング問題集 › 第10章 メソッドと関連関数
  24. 本動かして学ぶRustプログラミング問題集 › 第22章 ライフタイム
  25. 本動かして学ぶRustプログラミング問題集 › 第8章 参照と借用
  26. 本動かして学ぶRustプログラミング問題集 › 第9章 構造体