Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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 ^ この行のコメントアウトを解除してみてください
}

関連項目:

std::rcstd::sync::arc