2

有没有办法Rc<T>在计数为时移动对象1?我正在考虑如何实现:

fn take_ownership<T>(shared: Rc<T>) -> Result<T, Rc<T>> { ... }

语义是,T如果计数是1,你会得到,否则你会回来shared,所以你可以稍后再试。

4

1 回答 1

2

标准库提供的Rc::try_unwrap功能:

fn try_unwrap(this: Rc<T>) -> Result<T, Rc<T>>

Rc如果恰好有一个强引用,则返回包含的值。

否则,Err返回与Rc传入的相同的 an。

即使存在未完成的弱引用,这也会成功。

例子

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);
于 2017-08-07T05:07:16.510 回答