Cell

Struct Cell 

1.6.0 · Source
pub struct Cell<T: ?Sized> { /* private fields */ }
Expand description

A mutable memory location.

§Memory layout

Cell<T> has the same memory layout and caveats as UnsafeCell<T>. In particular, this means that Cell<T> has the same in-memory representation as its inner type T.

§Examples

In this example, you can see that Cell<T> enables mutation inside an immutable struct. In other words, it enables “interior mutability”.

use std::cell::Cell;

struct SomeStruct {
    regular_field: u8,
    special_field: Cell<u8>,
}

let my_struct = SomeStruct {
    regular_field: 0,
    special_field: Cell::new(1),
};

let new_value = 100;

// ERROR: `my_struct` is immutable
// my_struct.regular_field = new_value;

// WORKS: although `my_struct` is immutable, `special_field` is a `Cell`,
// which can always be mutated
my_struct.special_field.set(new_value);
assert_eq!(my_struct.special_field.get(), new_value);

See the module-level documentation for more.

Implementations§

Source§

impl<T> Cell<T>

1.0.0 (const: 1.24.0) · Source

pub const fn new(value: T) -> Cell<T>

Creates a new Cell containing the given value.

§Examples
use std::cell::Cell;

let c = Cell::new(5);
1.0.0 (const: unstable) · Source

pub fn set(&self, val: T)
where T:,

Sets the contained value.

§Examples
use std::cell::Cell;

let c = Cell::new(5);

c.set(10);
1.17.0 (const: 1.88.0) · Source

pub const fn replace(&self, val: T) -> T

Replaces the contained value with val, and returns the old contained value.

§Examples
use std::cell::Cell;

let cell = Cell::new(5);
assert_eq!(cell.get(), 5);
assert_eq!(cell.replace(10), 5);
assert_eq!(cell.get(), 10);
Source§

impl<T: Copy> Cell<T>

1.0.0 (const: 1.88.0) · Source

pub const fn get(&self) -> T

Returns a copy of the contained value.

§Examples
use std::cell::Cell;

let c = Cell::new(5);

let five = c.get();

Trait Implementations§

1.0.0 · Source§

impl<T> Send for Cell<T>
where T: Send + ?Sized,

1.0.0 · Source§

impl<T: ?Sized> !Sync for Cell<T>

Auto Trait Implementations§

§

impl<T> Freeze for Cell<T>
where T: Freeze + ?Sized,

§

impl<T> Unpin for Cell<T>
where T: Unpin + ?Sized,

Blanket Implementations§

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

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

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

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

The type returned in the event of a conversion error.
Source§

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

Performs the conversion.