Rc
複数の所有権が必要な場合は、Rc(参照カウント)を使用できます。Rc は参照の数、つまり Rc の内部にラップされた値の所有者の数を追跡します。
Rc の参照カウントは、Rc がクローンされるたびに 1 増加し、クローンされた Rc の 1 つがスコープから外れてドロップされるたびに 1 減少します。Rc の参照カウントが 0 になると(つまり、残っている所有者がいないことを意味します)、Rc と値の両方がすべてドロップされます。
Rc のクローンでは、ディープコピーは決して実行されません。クローンはラップされた値への別のポインターを作成するだけで、カウントを増加させます。
use std::rc::Rc; fn main() { let rc_examples = "Rc examples".to_string(); { println!("--- rc_a is created ---"); let rc_a: Rc<String> = Rc::new(rc_examples); println!("Reference Count of rc_a: {}", Rc::strong_count(&rc_a)); { println!("--- rc_a is cloned to rc_b ---"); let rc_b: Rc<String> = Rc::clone(&rc_a); println!("Reference Count of rc_b: {}", Rc::strong_count(&rc_b)); println!("Reference Count of rc_a: {}", Rc::strong_count(&rc_a)); // 2つの `Rc` は、内部の値が等しい場合に等しい println!("rc_a and rc_b are equal: {}", rc_a.eq(&rc_b)); // 値のメソッドを直接使用できる println!("Length of the value inside rc_a: {}", rc_a.len()); println!("Value of rc_b: {}", rc_b); println!("--- rc_b is dropped out of scope ---"); } println!("Reference Count of rc_a: {}", Rc::strong_count(&rc_a)); println!("--- rc_a is dropped out of scope ---"); } // エラー!`rc_examples` はすでに `rc_a` にムーブされている // そして `rc_a` がドロップされると、`rc_examples` も一緒にドロップされる // println!("rc_examples: {}", rc_examples); // TODO ^ この行のコメントアウトを解除してみてください }