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>>
- 可変参照の所有権を複数の変数に与えることができる。