为什么打开克隆的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如果没有其他Rc或Weak指向同一分配的指针,则将可变引用返回给给定的。
None否则返回,因为改变共享值是不安全的。另请参阅
make_mut,当有其他指针时,它将克隆内部值。
您有两个Rc指向相同数据的指针(即,foo和foo_cloned),因此获取对数据的可变引用是不安全的。
Rc不是摆脱 Rust 借用语义的魔术。Rust 仍然是一种单一所有权语言,并且仍然强制执行所有相同的保护;只是在 的情况下Rc,强制执行发生在运行时而不是编译时。