我看不到应该如何实现以下代码:
let a = Rc::new(5);
let b = Rc::clone(&a);
let c = Rc::clone(&a);
Run Code Online (Sandbox Code Playgroud)
Rc::clone
接受对的不变引用a
,但是设法以某种方式设法增加其引用计数(这需要可变的引用吗?)。
我尝试检查Rc
(参见此处)的源代码,但以我目前有限的知识仍无法理解它。
问题:之所以unsafe
可行,是因为它在后台使用代码,还是发生了其他事情?
在内部Rc
使用Cell
,可实现内部可变性:
struct RcBox<T: ?Sized> {
strong: Cell<usize>,
weak: Cell<usize>,
value: T,
}
Run Code Online (Sandbox Code Playgroud)
最终,所有道路都通向Cell::replace
。不可避免地有一个不安全的块:
mem::replace(unsafe { &mut *self.value.get() }, val)
Run Code Online (Sandbox Code Playgroud)
是的,您的直觉是正确的!