# Struct alloc::rc::Rc 1.0.0 [−] [src]

    pub struct Rc<T: ?Sized> { /* fields omitted */ }

A single-threaded reference-counting pointer.

See the module-level documentation for more details.

The inherent methods of `Rc` are all associated functions, which means that you have to call them as e.g. `Rc::get_mut(&value)` instead of `value.get_mut()`. This avoids conflicts with methods of the inner type `T`.

## Methods

### `impl<T> Rc<T>`
[src]

#### `fn new(value: T) -> Rc<T>`

Constructs a new `Rc<T>`.

# Examples

    use std::rc::Rc;

    let five = Rc::new(5);

#### `fn try_unwrap(this: Self) -> Result<T, Self>`
1.4.0

Returns the contained value, if the `Rc` has exactly one strong reference.

Otherwise, an `Err` is returned with the same `Rc` that was passed in.

This will succeed even if there are outstanding weak references.

# Examples

    use std::rc::Rc;

    let x = Rc::new(3);
    assert_eq!(Rc::try_unwrap(x), Ok(3));

    let x = Rc::new(4);
    let _y = x.clone();
    assert_eq!(*Rc::try_unwrap(x).unwrap_err(), 4);

#### `fn would_unwrap(this: &Self) -> bool`

Deprecated since 1.15.0

: too niche; use `strong_count` instead

🔬 This is a nightly-only experimental API. (`rc_would_unwrap` #28356)

just added for niche usecase

Checks whether `Rc::try_unwrap` would return `Ok`.

#### `fn into_raw(this: Self) -> *const T`
1.17.0

Consumes the `Rc`, returning the wrapped pointer.

To avoid a memory leak the pointer must be converted back to an `Rc` using `Rc::from_raw`.

# Examples

    use std::rc::Rc;

    let x = Rc::new(10);
    let x_ptr = Rc::into_raw(x);
    assert_eq!(unsafe { *x_ptr }, 10);

#### `unsafe fn from_raw(ptr: *const T) -> Self`
1.17.0

Constructs an `Rc` from a raw pointer.

The raw pointer must have been previously returned by a call to a `Rc::into_raw`.

This function is unsafe because improper use may lead to memory problems. For example, a double-free may occur if the function is called twice on the same raw pointer.

# Examples

    use std::rc::Rc;

    let x = Rc::new(10);
    let x_ptr = Rc::into_raw(x);

    unsafe {
        // Convert back to an `Rc` to prevent leak.
        let x = Rc::from_raw(x_ptr);
        assert_eq!(*x, 10);

        // Further calls to `Rc::from_raw(x_ptr)` would be memory unsafe.
    }

    // The memory was freed when `x` went out of scope above, so `x_ptr` is now dangling!

### `impl<T: ?Sized> Rc<T>`
[src]

#### `fn downgrade(this: &Self) -> Weak<T>`
1.4.0

Creates a new `Weak` pointer to this value.

# Examples

    use std::rc::Rc;

    let five = Rc::new(5);

    let weak_five = Rc::downgrade(&five);

#### `fn weak_count(this: &Self) -> usize`
1.15.0

Gets the number of `Weak` pointers to this value.

# Examples

    use std::rc::Rc;

    let five = Rc::new(5);
    let _weak_five = Rc::downgrade(&five);

    assert_eq!(1, Rc::weak_count(&five));

#### `fn strong_count(this: &Self) -> usize`
1.15.0

Gets the number of strong (`Rc`) pointers to this value.

# Examples

    use std::rc::Rc;

    let five = Rc::new(5);
    let _also_five = five.clone();

    assert_eq!(2, Rc::strong_count(&five));

#### `fn is_unique(this: &Self) -> bool`

Deprecated since 1.15.0

: too niche; use `strong_count` and `weak_count` instead

🔬 This is a nightly-only experimental API. (`is_unique` #28356)

uniqueness has unclear meaning

Returns true if there are no other `Rc` or `Weak` pointers to this inner value.

#### `fn get_mut(this: &mut Self) -> Option<&mut T>`
1.4.0

Returns a mutable reference to the inner value, if there are no other `Rc` or `Weak` pointers to the same value.

Returns `None` otherwise, because it is not safe to mutate a shared value.

See also `make_mut`, which will `clone` the inner value when it's shared.

# Examples

    use std::rc::Rc;

    let mut x = Rc::new(3);
    *Rc::get_mut(&mut x).unwrap() = 4;
    assert_eq!(*x, 4);

    let _y = x.clone();
    assert!(Rc::get_mut(&mut x).is_none());

#### `fn ptr_eq(this: &Self, other: &Self) -> bool`
1.17.0

Returns true if the two `Rc`s point to the same value (not just values that compare as equal).

# Examples

    use std::rc::Rc;

    let five = Rc::new(5);
    let same_five = five.clone();
    let other_five = Rc::new(5);

    assert!(Rc::ptr_eq(&five, &same_five));
    assert!(!Rc::ptr_eq(&five, &other_five));

### `impl<T: Clone> Rc<T>`
[src]

#### `fn make_mut(this: &mut Self) -> &mut T`
1.4.0

Makes a mutable reference into the given `Rc`.

If there are other `Rc` or `Weak` pointers to the same value, then `make_mut` will invoke `clone` on the inner value to ensure unique ownership. This is also referred to as clone-on-write.

See also `get_mut`, which will fail rather than cloning.

# Examples

    use std::rc::Rc;

    let mut data = Rc::new(5);

    *Rc::make_mut(&mut data) += 1;        // Won't clone anything
    let mut other_data = data.clone();    // Won't clone inner data
    *Rc::make_mut(&mut data) += 1;        // Clones inner data
    *Rc::make_mut(&mut data) += 1;        // Won't clone anything
    *Rc::make_mut(&mut other_data) *= 2;  // Won't clone anything

    // Now `data` and `other_data` point to different values.
    assert_eq!(*data, 8);
    assert_eq!(*other_data, 12);

## Trait Implementations

### `impl<T: ?Sized> !Send for Rc<T>`
[src]

### `impl<T: ?Sized> !Sync for Rc<T>`
[src]

### `impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<Rc<U>> for Rc<T>`
[src]

### `impl<T: ?Sized> Deref for Rc<T>`
[src]

#### `type Target = T`

The resulting type after dereferencing

#### `fn deref(&self) -> &T`

The method called to dereference a value

### `impl<T: ?Sized> Drop for Rc<T>`
[src]

#### `fn drop(&mut self)`

Drops the `Rc`.

This will decrement the strong reference count. If the strong reference count reaches zero then the only other references (if any) are `Weak`, so we `drop` the inner value.

# Examples

    use std::rc::Rc;

    struct Foo;

    impl Drop for Foo {
        fn drop(&mut self) {
            println!("dropped!");
        }
    }

    let foo  = Rc::new(Foo);
    let foo2 = foo.clone();

    drop(foo);    // Doesn't print anything
    drop(foo2);   // Prints "dropped!"

### `impl<T: ?Sized> Clone for Rc<T>`
[src]

#### `fn clone(&self) -> Rc<T>`

Makes a clone of the `Rc` pointer.

This creates another pointer to the same inner value, increasing the strong reference count.

# Examples

    use std::rc::Rc;

    let five = Rc::new(5);

    five.clone();

#### `fn clone_from(&mut self, source: &Self)`

Performs copy-assignment from `source`. Read more

### `impl<T: Default> Default for Rc<T>`
[src]

#### `fn default() -> Rc<T>`

Creates a new `Rc<T>`, with the `Default` value for `T`.

# Examples

    use std::rc::Rc;

    let x: Rc<i32> = Default::default();
    assert_eq!(*x, 0);

### `impl<T: ?Sized + PartialEq> PartialEq for Rc<T>`
[src]

#### `fn eq(&self, other: &Rc<T>) -> bool`

Equality for two `Rc`s.

Two `Rc`s are equal if their inner values are equal.

# Examples

    use std::rc::Rc;

    let five = Rc::new(5);

    assert!(five == Rc::new(5));

#### `fn ne(&self, other: &Rc<T>) -> bool`

Inequality for two `Rc`s.

Two `Rc`s are unequal if their inner values are unequal.

# Examples

    use std::rc::Rc;

    let five = Rc::new(5);

    assert!(five != Rc::new(6));

### `impl<T: ?Sized + Eq> Eq for Rc<T>`
[src]

### `impl<T: ?Sized + PartialOrd> PartialOrd for Rc<T>`
[src]

#### `fn partial_cmp(&self, other: &Rc<T>) -> Option<Ordering>`

Partial comparison for two `Rc`s.

The two are compared by calling `partial_cmp()` on their inner values.

# Examples

    use std::rc::Rc;
    use std::cmp::Ordering;

    let five = Rc::new(5);

    assert_eq!(Some(Ordering::Less), five.partial_cmp(&Rc::new(6)));

#### `fn lt(&self, other: &Rc<T>) -> bool`

Less-than comparison for two `Rc`s.

The two are compared by calling `<` on their inner values.

# Examples

    use std::rc::Rc;

    let five = Rc::new(5);

    assert!(five < Rc::new(6));

#### `fn le(&self, other: &Rc<T>) -> bool`

'Less than or equal to' comparison for two `Rc`s.

The two are compared by calling `<=` on their inner values.

# Examples

    use std::rc::Rc;

    let five = Rc::new(5);

    assert!(five <= Rc::new(5));

#### `fn gt(&self, other: &Rc<T>) -> bool`

Greater-than comparison for two `Rc`s.

The two are compared by calling `>` on their inner values.

# Examples

    use std::rc::Rc;

    let five = Rc::new(5);

    assert!(five > Rc::new(4));

#### `fn ge(&self, other: &Rc<T>) -> bool`

'Greater than or equal to' comparison for two `Rc`s.

The two are compared by calling `>=` on their inner values.

# Examples

    use std::rc::Rc;

    let five = Rc::new(5);

    assert!(five >= Rc::new(5));

### `impl<T: ?Sized + Ord> Ord for Rc<T>`
[src]

#### `fn cmp(&self, other: &Rc<T>) -> Ordering`

Comparison for two `Rc`s.

The two are compared by calling `cmp()` on their inner values.

# Examples

    use std::rc::Rc;
    use std::cmp::Ordering;

    let five = Rc::new(5);

    assert_eq!(Ordering::Less, five.cmp(&Rc::new(6)));

### `impl<T: ?Sized + Hash> Hash for Rc<T>`
[src]

#### `fn hash<H: Hasher>(&self, state: &mut H)`

Feeds this value into the state given, updating the hasher as necessary.

#### `fn hash_slice<H>(data: &[Self], state: &mut H) where H: Hasher`
1.3.0

Feeds a slice of this type into the state provided.

### `impl<T: ?Sized + Display> Display for Rc<T>`
[src]

#### `fn fmt(&self, f: &mut Formatter) -> Result`

Formats the value using the given formatter. Read more

### `impl<T: ?Sized + Debug> Debug for Rc<T>`
[src]

#### `fn fmt(&self, f: &mut Formatter) -> Result`

Formats the value using the given formatter.

### `impl<T: ?Sized> Pointer for Rc<T>`
[src]

#### `fn fmt(&self, f: &mut Formatter) -> Result`

Formats the value using the given formatter.

### `impl<T> From<T> for Rc<T>`
1.6.0
[src]

#### `fn from(t: T) -> Self`

Performs the conversion.

### `impl<T: ?Sized> Borrow<T> for Rc<T>`
[src]

#### `fn borrow(&self) -> &T`

Immutably borrows from an owned value. Read more

### `impl<T: ?Sized> AsRef<T> for Rc<T>`
1.5.0
[src]

#### `fn as_ref(&self) -> &T`

Performs the conversion.

# Help

## Keyboard Shortcuts

?
  Show this help dialog
S
  Focus the search field
⇤
  Move up in search results
⇥
  Move down in search results
⏎
  Go to active search result
+
  Collapse/expand all sections

## Search Tricks

Prefix searches with a type followed by a colon (e.g. `fn:`) to restrict the search to a given type.

Accepted types are: `fn`, `mod`, `struct`, `enum`, `trait`, `type`, `macro`, and `const`.

Search functions by type signature (e.g. `vec -> usize` or `* -> vec`)