目次

Rustの勉強[Rc<T> その2]

(更新: )ぎじゅつ

はじめに

#

NO IMAGEThe Rust Programming Language 日本語版 - The Rust Programming Language 日本語版
を読んでいる

  • 光らせる飽きてきたな
  • やる必要はあるけど別のこと考えるか

お勉強

#

NO IMAGERc<T>は、参照カウント方式のスマートポインタ - The Rust Programming Language 日本語版

  • ここから
    • あー複数の所有権をもてそうって話
    • 真相は謎

メモ

#

値とListを指すRc<T>を保持するようになりました

  • なるほど、何がなるほどかはなぞだが

bを作る際、 aの所有権を奪うのではなく、aが保持しているRc<List>をクローンします。

  • ここ大事そうか

  • そもそもconsってどういう挙動するんだっけ

NO IMAGECons in cons - RustA trait implemented by sets which can be used for hash-consing values of type C using keys of type Q

  • なんじゃこりゃ
  • んーなるほど
  • Cons<C, Q>のCに値を入れてQにconsを入れていくわけか
enum List {
    Cons(i32, Box<List>),
    Nil,
}

use crate::List::{Cons, Nil};

fn main() {
    let a = Cons(5, Box::new(Cons(10, Box::new(Nil))));
    let b = Cons(3, Box::new(a));
    let c = Cons(4, Box::new(a));
}
  • Boxだとb,cにmoveしちゃうんだな
enum List {
    Cons(i32, Rc<List>),
    Nil,
}

use crate::List::{Cons, Nil};
use std::rc::Rc;

fn main() {
    let a = Rc::new(Cons(5, Rc::new(Cons(10, Rc::new(Nil)))));
    let b = Cons(3, Rc::clone(&a));
    let c = Cons(4, Rc::clone(&a));
}
  • でこうするとcloneするから問題ないと
  • 動きは理解した
fn main() {
    let a = Rc::new(Cons(5, Rc::new(Cons(10, Rc::new(Nil)))));
    // "a作成後のカウント = {}"
    println!("count after creating a = {}", Rc::strong_count(&a));
    let b = Cons(3, Rc::clone(&a));
    // "b作成後のカウント = {}"
    println!("count after creating b = {}", Rc::strong_count(&a));
    {
        let c = Cons(4, Rc::clone(&a));
        // "c作成後のカウント = {}"
        println!("count after creating c = {}", Rc::strong_count(&a));
    }
    // "cがスコープを抜けた後のカウント = {}"
    println!("count after c goes out of scope = {}", Rc::strong_count(&a));
}
  • これはわかった

  • どういう動きをするかだけは理解できたがなぜそれをするかわからん

  • んー、geminiにきいた(最近信じてない)

  • とりあえずBoxとの違いはムーブさせずに複数ヵ所から同じ値をポインタで参照できる

  • あー参照カウントって今誰が参照しているかって話か

まとめ

#
  • めっちゃ分かりづらくてムカついた
  • おそらく実態はポインタの先にある値を複数のスマートポインタから参照するだけ
  • 今何個参照されているとか値が取れる
    • え?これだけ?は?

次ここ
NO IMAGERefCell<T>と内部可変性パターン - The Rust Programming Language 日本語版