有没有办法在计数1
时从Rc<T>
中移动对象?我正在考虑如何实现:
fn take_ownership<T>(shared: Rc<T>) -> Result<T, Rc<T>> { ... }
语义是,如果计数1
,你会得到T
,否则你会得到shared
,以便稍后重试。
标准库提供Rc::try_unwrap
函数:
fn try_unwrap(this: Rc<T>) -> Result<T, Rc<T>>
返回包含的值(如果
Rc
只有一个强值( 参考。否则,将返回
Err
,其Rc
与传入的相同。即使存在突出的弱引用,这也将成功。
例子
use std::rc::Rc; let x = Rc::new(3); assert_eq!(Rc::try_unwrap(x), Ok(3)); let x = Rc::new(4); let _y = Rc::clone(&x); assert_eq!(*Rc::try_unwrap(x).unwrap_err(), 4);