为什么打开克隆的Rc会引起恐慌?

为什么这段代码会在第 7 行出现恐慌?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;
}

回答

从该Rc文档(重点煤矿)

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

Rc如果没有其他RcWeak指向同一分配的指针,则将可变引用返回给给定的。

None否则返回,因为改变共享值是不安全的。

另请参阅make_mut,当有其他指针时,它将克隆内部值。

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

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


以上是为什么打开克隆的Rc会引起恐慌?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>