Rc
provides shared ownership so by default its contents can't be mutated, while Box
provides exclusive ownership and thus mutation is allowed:
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
}
In addition Rc
cannot be sent between threads, because it doesn't implement Send
.
The bottom line is they are meant for different things: if you don't need shared access, use Box
; otherwise, use Rc
(or Arc
for multi-threaded shared usage) and keep in mind you will be needing Cell
or RefCell
for internal mutability.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…