Rc

名前は、Reference Counted (参照カウント)の略。

Rc<T>はシングルスレッド用のカウンタを持つポインターでヒープ上で管理されます。T値に対する複数の所有権を取得できます。

::cloneで所有権の共有と参照カウンタの加算、::strong_countで今の参照数を取得できます。

let thirty_three: Rc<i32> = Rc::new(33);

{
  let cloned = thirty_three.clone();

  // `thirty_three` と `cloned` は同じ
  assert!(thirty_three.eq(&cloned));

  assert_eq!(Rc::strong_count(&thirty_three), 2);

  // スコープを抜けるので参照カウンタを -1 する
}

assert_eq!(Rc::strong_count(&thirty_three), 1);

Tに変換できるDerefを実装してる為、Boxと同じようにTの持つメソッドはそのまま実行できます。

assert_eq!(thirty_three.wrapping_add(1), 34);