为什么打开克隆的 Rc 会导致恐慌?

Why does unwrapping a cloned Rc cause a panic?

为什么这段代码在第 7 行出现 panic? foo_unwrapped 不应该是第 5 行的 Some(3) 而不是 None 吗?

use std::rc::Rc;
fn main()
{
    let foo: Rc<i32> = Rc::new(3);
    let mut foo_cloned = Rc::clone(&foo);
    let mut foo_unwrapped = Rc::get_mut(&mut foo_cloned).unwrap();  
    foo_unwrapped = &mut 42;
}

来自 the Rc docs(强调我的)

pub fn get_mut(this: &mut Rc<T>) -> Option<&mut T>

Returns a mutable reference into the given Rc, if there are no other Rc or Weak pointers to the same allocation.

Returns None otherwise, because it is not safe to mutate a shared value.

See also make_mut, which will clone the inner value when there are other pointers.

您有两个 Rc 指针指向相同的数据(即 foofoo_cloned),因此获取对数据的可变引用是不安全的。

Rc 并不是摆脱 Rust 借用语义的魔术。 Rust 仍然是一种单一所有权语言,并且仍然执行所有相同的保护措施;只是在 Rc 的情况下,强制执行发生在运行时而不是编译时。