【Rust】Rc と Cell と RefCell

Rustでは、ある値の所有権を持つことができるのは一つの変数のみである。所有権は譲渡できるが、同時に複数の変数が一つの値の所有権を持つことはできない。しかし、それでは困ることも多々ある。そこで Rc なるものが用意されている。

Rc<T>

  • 複数の変数に所有権を与えることができる。
  • いわゆるスマートポインタである。Rc は参照カウンタ(Reference Counter)に由来する名前。
  • ただし不変値しか扱えない。
  • clone() すると参照がコピーされ、参照カウンタがインクリメントされる。
  • clone() という関数名だがディープコピーでないことに注意。
  • a.clone() と書くより Rc::clone(&a) と書いたほうがディープコピーでないことが分かりやすい。

Cell<T>

  • 可変な値を不変値として扱える。
  • get() で値を取得し、set() で値を設定できる。
  • T は Copy トレイトを実装されてなければならない。(get() / set() は値をコピーするため)

RefCell<T>

  • 可変な参照を不変参照として扱える。
  • borrow() で不変参照を取得できる。
  • borrow_mut() で可変参照を取得できる。
  • borrow() で取得した不変参照が生きている間に borrow_mut() で可変参照を取得しようとすると実行時エラーになる。

Rc<Cell<T>>

  • 可変値の所有権を複数の変数に与えることができる。

Rc<RefCell<T>>

  • 可変参照の所有権を複数の変数に与えることができる。