为什么打开克隆的 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
指针指向相同的数据(即 foo
和 foo_cloned
),因此获取对数据的可变引用是不安全的。
Rc
并不是摆脱 Rust 借用语义的魔术。 Rust 仍然是一种单一所有权语言,并且仍然执行所有相同的保护措施;只是在 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>
Returns a mutable reference into the given
Rc
, if there are no otherRc
orWeak
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
指针指向相同的数据(即 foo
和 foo_cloned
),因此获取对数据的可变引用是不安全的。
Rc
并不是摆脱 Rust 借用语义的魔术。 Rust 仍然是一种单一所有权语言,并且仍然执行所有相同的保护措施;只是在 Rc
的情况下,强制执行发生在运行时而不是编译时。