Условно переместить T из Rc<T>, когда счетчик равен 1
Есть ли способ переместить объект из Rc<T>
когда счет 1
? Я думаю о том, как можно реализовать:
fn take_ownership<T>(shared: Rc<T>) -> Result<T, Rc<T>> { ... }
Семантика будет то, что вы получите T
если счет 1
и ты вернешься shared
в противном случае вы можете попробовать позже.
1 ответ
Решение
Стандартная библиотека обеспечивает 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);