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 になる }