web-dev-qa-db-ja.com

RcとBoxを使用する場合

RcBoxの両方を使用する次のコードがあります。それらの違いは何ですか?どちらがいいですか?

use std::rc::Rc;

fn main() {
    let a = Box::new(1);
    let a1 = &a;
    let a2 = &a;
    let b = Rc::new(1);
    let b1 = b.clone();
    let b2 = b.clone();

    println!("{} {}", a1, a2);
    println!("{} {}", b1, b2);
}

遊び場リンク

14

Rc は共有所有権を提供するため、デフォルトではコンテンツを変更できませんが、 Box は排他的な所有権を提供するため、変更が許可されます。

use std::rc::Rc;

fn main() {
    let mut a = Box::new(1);
    let mut b = Rc::new(1);

    *a = 2; // works
    *b = 2; // doesn't
}

さらに、RcSendを実装していないため、スレッド間で送信することはできません。

つまり、共有アクセスが必要ない場合は、Boxを使用します。それ以外の場合は、Rc(またはマルチスレッド共有で使用する場合はArc)を使用します。内部の可変性のためにCellまたはRefCellが必要になることに注意してください。

8
ljedrz