我看不懂下面的代码应该如何实现:
let a = Rc::new(5);
let b = Rc::clone(&a);
let c = Rc::clone(&a);
Rc::clone
接受一个不可变引用a
,但却成功地增加了它的引用计数(这需要可变引用?)。
我尝试检查Rc
的源代码(请参见此处),但由于我当前知识有限,无法理解其中的内容。
这是否是因为它在底层使用了unsafe
代码,还是其他原因?
Rc
使用Cell
,它使内部可变性成为可能。struct RcBox<T: ?Sized> {
strong: Cell<usize>,
weak: Cell<usize>,
value: T,
}
最终,所有的路都通向Cell::replace
。不可避免地,它里面包含一个unsafe块:
mem::replace(unsafe { &mut *self.value.get() }, val)
在内部,引用计数器是通过使用Cell
实现的,该数据类型被设计用来"在不可变结构内部启用变异"。同时,Cell
使用了unsafe关键字来允许变异操作,你说得没错。