Rust:Rc :: clone(&pointer)如何增加引用计数?

Iva*_*nov 2 rust

我看不到应该如何实现以下代码:

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可行,是因为它在后台使用代码,还是发生了其他事情?

edw*_*rdw 6

在内部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)

是的,您的直觉是正确的!