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; }
これも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); }