Rc
とBox
の両方を使用する次のコードがあります。それらの違いは何ですか?どちらがいいですか?
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);
}
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
}
さらに、Rc
はSend
を実装していないため、スレッド間で送信することはできません。
つまり、共有アクセスが必要ない場合は、Box
を使用します。それ以外の場合は、Rc
(またはマルチスレッド共有で使用する場合はArc
)を使用します。内部の可変性のためにCell
またはRefCell
が必要になることに注意してください。