Struct UniqueRc
struct UniqueRc<T: ?Sized, A: Allocator = crate::alloc::Global> { ... }
A uniquely owned Rc.
This represents an Rc that is known to be uniquely owned -- that is, have exactly one strong
reference. Multiple weak pointers can be created, but attempts to upgrade those to strong
references will fail unless the UniqueRc they point to has been converted into a regular Rc.
Because they are uniquely owned, the contents of a UniqueRc can be freely mutated. A common
use case is to have an object be mutable during its initialization phase but then have it become
immutable and converted to a normal Rc.
This can be used as a flexible way to create cyclic data structures, as in the example below.
use ;
create_gadget.unwrap;
An advantage of using UniqueRc over Rc::new_cyclic to build cyclic data structures is that
Rc::new_cyclic's data_fn parameter cannot be async or return a Result. As shown in the
previous example, UniqueRc allows for more flexibility in the construction of cyclic data,
including fallible or async constructors.
Implementations
impl<T> UniqueRc<T>
fn new(value: T) -> SelfCreates a new
UniqueRc.Weak references to this
UniqueRccan be created withUniqueRc::downgrade. Upgrading these weak references will fail before theUniqueRchas been converted into anRc. After converting theUniqueRcinto anRc, any weak references created beforehand will point to the newRc.fn map<U, impl FnOnce(T) -> U: FnOnce(T) -> U>(this: Self, f: impl FnOnce(T) -> U) -> UniqueRc<U>Maps the value in a
UniqueRc, reusing the allocation if possible.fis called on a reference to the value in theUniqueRc, and the result is returned, also in aUniqueRc.Note: this is an associated function, which means that you have to call it as
UniqueRc::map(u, f)instead ofu.map(f). This is so that there is no conflict with a method on the inner type.Examples
use UniqueRc; let r = new; let new = map; assert_eq!;fn try_map<R, impl FnOnce(T) -> R: FnOnce(T) -> R>(this: Self, f: impl FnOnce(T) -> R) -> <<R as >::Residual as Residual<UniqueRc<<R as >::Output>>>::TryType where R: Try, <R as >::Residual: Residual<UniqueRc<<R as >::Output>>Attempts to map the value in a
UniqueRc, reusing the allocation if possible.fis called on a reference to the value in theUniqueRc, and if the operation succeeds, the result is returned, also in aUniqueRc.Note: this is an associated function, which means that you have to call it as
UniqueRc::try_map(u, f)instead ofu.try_map(f). This is so that there is no conflict with a method on the inner type.Examples
use UniqueRc; let b = new; let new = try_map.unwrap; assert_eq!;
impl<T, A: Allocator> UniqueRc<T, A>
fn new_in(value: T, alloc: A) -> SelfCreates a new
UniqueRcin the provided allocator.Weak references to this
UniqueRccan be created withUniqueRc::downgrade. Upgrading these weak references will fail before theUniqueRchas been converted into anRc. After converting theUniqueRcinto anRc, any weak references created beforehand will point to the newRc.
impl<T: ?Sized, A: Allocator + Clone> UniqueRc<T, A>
fn downgrade(this: &Self) -> Weak<T, A>Creates a new weak reference to the
UniqueRc.Attempting to upgrade this weak reference will fail before the
UniqueRchas been converted to aRcusingUniqueRc::into_rc.
impl<T: ?Sized, A: Allocator> UniqueRc<T, A>
impl<P, T> Receiver for UniqueRc<T, A>
impl<T> Any for UniqueRc<T, A>
fn type_id(self: &Self) -> TypeId
impl<T> Borrow for UniqueRc<T, A>
fn borrow(self: &Self) -> &T
impl<T> BorrowMut for UniqueRc<T, A>
fn borrow_mut(self: &mut Self) -> &mut T
impl<T> From for UniqueRc<T, A>
fn from(t: T) -> TReturns the argument unchanged.
impl<T> ToString for UniqueRc<T, A>
fn to_string(self: &Self) -> String
impl<T, A = Global> RefUnwindSafe for UniqueRc<T, A>
impl<T, A = Global> UnwindSafe for UniqueRc<T, A>
impl<T, A> Freeze for UniqueRc<T, A>
impl<T, U> Into for UniqueRc<T, A>
fn into(self: Self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom for UniqueRc<T, A>
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto for UniqueRc<T, A>
fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error>
impl<T: ?Sized + Eq, A: Allocator> Eq for UniqueRc<T, A>
impl<T: ?Sized + Hash, A: Allocator> Hash for UniqueRc<T, A>
fn hash<H: Hasher>(self: &Self, state: &mut H)
impl<T: ?Sized + Ord, A: Allocator> Ord for UniqueRc<T, A>
fn cmp(self: &Self, other: &UniqueRc<T, A>) -> OrderingComparison for two
UniqueRcs.The two are compared by calling
cmp()on their inner values.Examples
use UniqueRc; use Ordering; let five = new; assert_eq!;
impl<T: ?Sized + PartialEq, A: Allocator> PartialEq for UniqueRc<T, A>
fn eq(self: &Self, other: &Self) -> boolEquality for two
UniqueRcs.Two
UniqueRcs are equal if their inner values are equal.Examples
use UniqueRc; let five = new; assert!;fn ne(self: &Self, other: &Self) -> boolInequality for two
UniqueRcs.Two
UniqueRcs are not equal if their inner values are not equal.Examples
use UniqueRc; let five = new; assert!;
impl<T: ?Sized + PartialOrd, A: Allocator> PartialOrd for UniqueRc<T, A>
fn partial_cmp(self: &Self, other: &UniqueRc<T, A>) -> Option<Ordering>Partial comparison for two
UniqueRcs.The two are compared by calling
partial_cmp()on their inner values.Examples
use UniqueRc; use Ordering; let five = new; assert_eq!;fn lt(self: &Self, other: &UniqueRc<T, A>) -> boolLess-than comparison for two
UniqueRcs.The two are compared by calling
<on their inner values.Examples
use UniqueRc; let five = new; assert!;fn le(self: &Self, other: &UniqueRc<T, A>) -> bool'Less than or equal to' comparison for two
UniqueRcs.The two are compared by calling
<=on their inner values.Examples
use UniqueRc; let five = new; assert!;fn gt(self: &Self, other: &UniqueRc<T, A>) -> boolGreater-than comparison for two
UniqueRcs.The two are compared by calling
>on their inner values.Examples
use UniqueRc; let five = new; assert!;fn ge(self: &Self, other: &UniqueRc<T, A>) -> bool'Greater than or equal to' comparison for two
UniqueRcs.The two are compared by calling
>=on their inner values.Examples
use UniqueRc; let five = new; assert!;
impl<T: ?Sized + Unsize<U>, U: ?Sized> DispatchFromDyn for UniqueRc<T>
impl<T: ?Sized + Unsize<U>, U: ?Sized, A: Allocator> CoerceUnsized for UniqueRc<T, A>
impl<T: ?Sized + fmt::Debug, A: Allocator> Debug for UniqueRc<T, A>
fn fmt(self: &Self, f: &mut fmt::Formatter<'_>) -> fmt::Result
impl<T: ?Sized + fmt::Display, A: Allocator> Display for UniqueRc<T, A>
fn fmt(self: &Self, f: &mut fmt::Formatter<'_>) -> fmt::Result
impl<T: ?Sized, A: Allocator> AsMut for UniqueRc<T, A>
fn as_mut(self: &mut Self) -> &mut T
impl<T: ?Sized, A: Allocator> AsRef for UniqueRc<T, A>
fn as_ref(self: &Self) -> &T
impl<T: ?Sized, A: Allocator> Borrow for UniqueRc<T, A>
fn borrow(self: &Self) -> &T
impl<T: ?Sized, A: Allocator> BorrowMut for UniqueRc<T, A>
fn borrow_mut(self: &mut Self) -> &mut T
impl<T: ?Sized, A: Allocator> Deref for UniqueRc<T, A>
fn deref(self: &Self) -> &T
impl<T: ?Sized, A: Allocator> DerefMut for UniqueRc<T, A>
fn deref_mut(self: &mut Self) -> &mut T
impl<T: ?Sized, A: Allocator> DerefPure for UniqueRc<T, A>
impl<T: ?Sized, A: Allocator> Drop for UniqueRc<T, A>
fn drop(self: &mut Self)
impl<T: ?Sized, A: Allocator> PinCoerceUnsized for UniqueRc<T, A>
impl<T: ?Sized, A: Allocator> Pointer for UniqueRc<T, A>
fn fmt(self: &Self, f: &mut fmt::Formatter<'_>) -> fmt::Result