Struct rustc_ap_rustc_data_structures::sync::OnceCell[][src]

pub struct OnceCell<T> { /* fields omitted */ }
🔬 This is a nightly-only experimental API. (once_cell)
Expand description

A cell which can be written to only once.

Unlike RefCell, a OnceCell only provides shared &T references to its value. Unlike Cell, a OnceCell doesn’t require copying or replacing the value to access it.

Examples

#![feature(once_cell)]

use std::lazy::OnceCell;

let cell = OnceCell::new();
assert!(cell.get().is_none());

let value: &String = cell.get_or_init(|| {
    "Hello, World!".to_string()
});
assert_eq!(value, "Hello, World!");
assert!(cell.get().is_some());

Implementations

impl<T> OnceCell<T>[src]

pub const fn new() -> OnceCell<T>[src]

🔬 This is a nightly-only experimental API. (once_cell)

Creates a new empty cell.

pub fn get(&self) -> Option<&T>[src]

🔬 This is a nightly-only experimental API. (once_cell)

Gets the reference to the underlying value.

Returns None if the cell is empty.

pub fn get_mut(&mut self) -> Option<&mut T>[src]

🔬 This is a nightly-only experimental API. (once_cell)

Gets the mutable reference to the underlying value.

Returns None if the cell is empty.

pub fn set(&self, value: T) -> Result<(), T>[src]

🔬 This is a nightly-only experimental API. (once_cell)

Sets the contents of the cell to value.

Errors

This method returns Ok(()) if the cell was empty and Err(value) if it was full.

Examples

#![feature(once_cell)]

use std::lazy::OnceCell;

let cell = OnceCell::new();
assert!(cell.get().is_none());

assert_eq!(cell.set(92), Ok(()));
assert_eq!(cell.set(62), Err(62));

assert!(cell.get().is_some());

pub fn get_or_init<F>(&self, f: F) -> &T where
    F: FnOnce() -> T, 
[src]

🔬 This is a nightly-only experimental API. (once_cell)

Gets the contents of the cell, initializing it with f if the cell was empty.

Panics

If f panics, the panic is propagated to the caller, and the cell remains uninitialized.

It is an error to reentrantly initialize the cell from f. Doing so results in a panic.

Examples

#![feature(once_cell)]

use std::lazy::OnceCell;

let cell = OnceCell::new();
let value = cell.get_or_init(|| 92);
assert_eq!(value, &92);
let value = cell.get_or_init(|| unreachable!());
assert_eq!(value, &92);

pub fn get_or_try_init<F, E>(&self, f: F) -> Result<&T, E> where
    F: FnOnce() -> Result<T, E>, 
[src]

🔬 This is a nightly-only experimental API. (once_cell)

Gets the contents of the cell, initializing it with f if the cell was empty. If the cell was empty and f failed, an error is returned.

Panics

If f panics, the panic is propagated to the caller, and the cell remains uninitialized.

It is an error to reentrantly initialize the cell from f. Doing so results in a panic.

Examples

#![feature(once_cell)]

use std::lazy::OnceCell;

let cell = OnceCell::new();
assert_eq!(cell.get_or_try_init(|| Err(())), Err(()));
assert!(cell.get().is_none());
let value = cell.get_or_try_init(|| -> Result<i32, ()> {
    Ok(92)
});
assert_eq!(value, Ok(&92));
assert_eq!(cell.get(), Some(&92))

pub fn into_inner(self) -> Option<T>[src]

🔬 This is a nightly-only experimental API. (once_cell)

Consumes the cell, returning the wrapped value.

Returns None if the cell was empty.

Examples

#![feature(once_cell)]

use std::lazy::OnceCell;

let cell: OnceCell<String> = OnceCell::new();
assert_eq!(cell.into_inner(), None);

let cell = OnceCell::new();
cell.set("hello".to_string()).unwrap();
assert_eq!(cell.into_inner(), Some("hello".to_string()));

pub fn take(&mut self) -> Option<T>[src]

🔬 This is a nightly-only experimental API. (once_cell)

Takes the value out of this OnceCell, moving it back to an uninitialized state.

Has no effect and returns None if the OnceCell hasn’t been initialized.

Safety is guaranteed by requiring a mutable reference.

Examples

#![feature(once_cell)]

use std::lazy::OnceCell;

let mut cell: OnceCell<String> = OnceCell::new();
assert_eq!(cell.take(), None);

let mut cell = OnceCell::new();
cell.set("hello".to_string()).unwrap();
assert_eq!(cell.take(), Some("hello".to_string()));
assert_eq!(cell.get(), None);

Trait Implementations

impl<T> Clone for OnceCell<T> where
    T: Clone
[src]

pub fn clone(&self) -> OnceCell<T>[src]

Returns a copy of the value. Read more

fn clone_from(&mut self, source: &Self)1.0.0[src]

Performs copy-assignment from source. Read more

impl<T> Debug for OnceCell<T> where
    T: Debug
[src]

pub fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>[src]

Formats the value using the given formatter. Read more

impl<T> Default for OnceCell<T>[src]

pub fn default() -> OnceCell<T>[src]

Returns the “default value” for a type. Read more

impl<T> From<T> for OnceCell<T>[src]

pub fn from(value: T) -> OnceCell<T>[src]

Performs the conversion.

impl<T> PartialEq<OnceCell<T>> for OnceCell<T> where
    T: PartialEq<T>, 
[src]

pub fn eq(&self, other: &OnceCell<T>) -> bool[src]

This method tests for self and other values to be equal, and is used by ==. Read more

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0[src]

This method tests for !=.

impl<T> Eq for OnceCell<T> where
    T: Eq
[src]

Auto Trait Implementations

impl<T> !RefUnwindSafe for OnceCell<T>

impl<T> Send for OnceCell<T> where
    T: Send

impl<T> !Sync for OnceCell<T>

impl<T> Unpin for OnceCell<T> where
    T: Unpin

impl<T> UnwindSafe for OnceCell<T> where
    T: UnwindSafe

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

pub fn type_id(&self) -> TypeId[src]

Gets the TypeId of self. Read more

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

pub fn borrow(&self) -> &T[src]

Immutably borrows from an owned value. Read more

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

pub fn borrow_mut(&mut self) -> &mut T[src]

Mutably borrows from an owned value. Read more

impl<Q, K> Equivalent<K> for Q where
    K: Borrow<Q> + ?Sized,
    Q: Eq + ?Sized
[src]

pub fn equivalent(&self, key: &K) -> bool[src]

Compare self to key and return true if they are equal.

impl<T> From<!> for T[src]

pub fn from(t: !) -> T[src]

Performs the conversion.

impl<T> From<T> for T[src]

pub fn from(t: T) -> T[src]

Performs the conversion.

impl<T> Instrument for T[src]

fn instrument(self, span: Span) -> Instrumented<Self>[src]

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more

fn in_current_span(self) -> Instrumented<Self>[src]

Instruments this type with the current Span, returning an Instrumented wrapper. Read more

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

pub fn into(self) -> U[src]

Performs the conversion.

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

pub fn to_owned(&self) -> T[src]

Creates owned data from borrowed data, usually by cloning. Read more

pub fn clone_into(&self, target: &mut T)[src]

🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

Uses borrowed data to replace owned data, usually by cloning. Read more

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>[src]

Performs the conversion.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

pub fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>[src]

Performs the conversion.

impl<V, T> VZip<V> for T where
    V: MultiLane<T>, 

pub fn vzip(self) -> V

impl<'a, T> Captures<'a> for T where
    T: ?Sized
[src]

impl<T> Erased for T[src]