Условно переместить 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);
Другие вопросы по тегам