如何解决为什么打开克隆的 Rc 会引起恐慌?
为什么这段代码会在第 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>
如果没有其他 Rc
或 Rc
指针指向相同的分配,则返回对给定 Weak
的可变引用。
否则返回 None
,因为改变共享值是不安全的。
另见make_mut
,当有其他指针时,它会克隆内部值。
您有两个 Rc
指针指向相同的数据(即 foo
和 foo_cloned
),因此获取对数据的可变引用是不安全的。
Rc
并不是摆脱 Rust 借用语义的魔术。 Rust 仍然是一种单一所有权语言,并且仍然强制执行所有相同的保护;只是在 Rc
的情况下,强制执行发生在运行时而不是编译时。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。