スポンサーリンク

Rustの値の可変が可能なSharedポインタを試す

use std::rc::Rc;
use std::cell::RefCell;

#[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 value = 
    Rc::new(
      RefCell::new(
        Color::new(0.3,0.2,0.1)
      )
    );

  let a = Rc::clone(&value); // ポインタを複製
  let b = Rc::clone(&value); // ポインタを複製

  // borrow_mut()でアクセス
  // 構造体を上書きする
  *a.borrow_mut() = Color::new(0.0,0.0,0.0);

  println!("a: {:?}", a.borrow());

  // 構造体の要素を上書きする
  b.borrow_mut().r=1.0;

  println!("b: {:?}", b.borrow());

  // borrow()では書き込みできない
  // b.borrow().g = 1.0;


}

Optionとの組み合わせ例

これもNoneと組み合わせてnullptrのようなものを表現できる。

この時、Rc::strong_countを使うと、有効なポインタの個数を取得できる。

use std::borrow::Borrow;
use std::rc::Rc;
use std::cell::RefCell;

#[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 value = 
    Rc::new(
      RefCell::new(
        Color::new(0.3,0.2,0.1)
      )
    );

  let mut ref_a = Some(Rc::clone(&value)); // ポインタを複製
  let ref_b = Some(Rc::clone(&value)); // ポインタを複製

  // 参照の個数を取得
  // value , ref_a , ref_b の三つなので3
  println!("pointer count: {}",Rc::strong_count(&value)); // 3

  ref_a = None; // ref_a を無効にする

  // ref_a が None なので value , ref_b の二つで2
  println!("pointer count: {}",Rc::strong_count(&value)); // 2

  if let Some(aa) = ref_a{
    *aa.borrow_mut() = Color::new(0.0,0.0,0.0);
  }
  else{
    println!("ref_a is invalid");
  }

  if let Some(bb) = ref_b{
    *bb.borrow_mut() = Color::new(1.0,1.0,1.0);
  }
  else{
    println!("ref_b is invalid");
  }

// ref_bで書き換えた値が得られる println!("{:?}",value); }

コメントを残す

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

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


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