スポンサーリンク

RustのWeakポインタを試す

Rc::newでSharedポインタを作り、Rc::downgrade()関数でWeakポインタを作る。

問題は有効性の確認のところで、upgrade()関数がOption<Rc<T>>を返すので、upgrade()の戻り値がSomeを持っている。Someが有効かどうかをチェックするため、if letでパターンマッチする。

use std::rc::{Rc, Weak};

#[derive(Debug)]
struct Color{
  r:f32,
  g:f32,
  b:f32
}
impl Color{
  fn new(R:f32,G:f32,B:f32)->Color{
    return Color{r:R,g:G,b:B};
  }
}
      
fn main() {


  let weak;
  {
    // Sharedポインタ
    let shared = Rc::new(Color::new(0.3,0.5,0.0));

    // Weakポインタ作成
    weak = Rc::downgrade(&shared);

    // 所有権を持っているのがsharedなので、ここでsharedは破棄される

  }

  // weak.Some が有効なら、変数valueに値が入るので表示する
  if let Some(value) = weak.upgrade() {

    // weakが指しているデータを表示
    println!("{:?}", value);

  } else {
      println!("weakは無効");
  }


}

Weakポインタの個数を取得できる。weak_count()を呼び出す。

fn main() {


  let weak;
  {
    // Sharedポインタ
    let shared = Rc::new(Color::new(0.3,0.5,0.0));

    // Weakポインタ作成
    weak = Rc::downgrade(&shared);

    // Weakポインタをコピーする
    let weak2 = weak.clone();

    println!("{}",weak.weak_count()); // 有効なWeakの数を得る。2 になる

    // 所有権を持っているのがsharedなので、ここでsharedは破棄される
  }

  println!("{}",weak.weak_count()); // 有効なWeakの数を得る。 0 になる


}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: