Struct Cell
struct Cell<T: ?Sized> { ... }
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 Cell;
let my_struct = SomeStruct ;
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;
assert_eq!;
See the module-level documentation for more.
Implementations
impl<T> Cell<T>
const fn new(value: T) -> Cell<T>Creates a new
Cellcontaining the given value.Examples
use Cell; let c = new;const fn set(self: &Self, val: T) where T:Sets the contained value.
Examples
use Cell; let c = new; c.set;fn swap(self: &Self, other: &Self)Swaps the values of two
Cells.The difference with
std::mem::swapis that this function doesn't require a&mutreference.Panics
This function will panic if
selfandotherare differentCells that partially overlap. (Using just standard library methods, it is impossible to create such partially overlappingCells. However, unsafe code is allowed to e.g. create two&Cell<[i32; 2]>that partially overlap.)Examples
use Cell; let c1 = new; let c2 = new; c1.swap; assert_eq!; assert_eq!;const fn replace(self: &Self, val: T) -> TReplaces the contained value with
val, and returns the old contained value.Examples
use Cell; let cell = new; assert_eq!; assert_eq!; assert_eq!;const fn into_inner(self: Self) -> TUnwraps the value, consuming the cell.
Examples
use Cell; let c = new; let five = c.into_inner; assert_eq!;
impl<T> Cell<[T]>
const fn as_slice_of_cells(self: &Self) -> &[Cell<T>]Returns a
&[Cell<T>]from a&Cell<[T]>Examples
use Cell; let slice: &mut = &mut ; let cell_slice: & = from_mut; let slice_cell: & = cell_slice.as_slice_of_cells; assert_eq!;
impl<T, N: usize> Cell<[T; N]>
const fn as_array_of_cells(self: &Self) -> &[Cell<T>; N]Returns a
&[Cell<T>; N]from a&Cell<[T; N]>Examples
use Cell; let mut array: = ; let cell_array: & = from_mut; let array_cell: & = cell_array.as_array_of_cells;
impl<T: ?Sized> Cell<T>
const fn as_ptr(self: &Self) -> *mut TReturns a raw pointer to the underlying data in this cell.
Examples
use Cell; let c = new; let ptr = c.as_ptr;const fn get_mut(self: &mut Self) -> &mut TReturns a mutable reference to the underlying data.
This call borrows
Cellmutably (at compile-time) which guarantees that we possess the only reference.However be cautious: this method expects
selfto be mutable, which is generally not the case when using aCell. If you require interior mutability by reference, consider usingRefCellwhich provides run-time checked mutable borrows through itsborrow_mutmethod.Examples
use Cell; let mut c = new; *c.get_mut += 1; assert_eq!;const fn from_mut(t: &mut T) -> &Cell<T>Returns a
&Cell<T>from a&mut TExamples
use Cell; let slice: &mut = &mut ; let cell_slice: & = from_mut; let slice_cell: & = cell_slice.as_slice_of_cells; assert_eq!;
impl<T: CloneFromCell> Cell<T>
fn get_cloned(self: &Self) -> SelfGet a clone of the
Cellthat contains a copy of the original value.This allows a cheaply
Clone-able type like anRcto be stored in aCell, exposing the cheaperclone()method.Examples
use Cell; use Rc; let rc = new; let c1 = new; let c2 = c1.get_cloned; assert_eq!;
impl<T: Copy> Cell<T>
const fn get(self: &Self) -> TReturns a copy of the contained value.
Examples
use Cell; let c = new; let five = c.get;const fn update<impl [const] FnOnce(T) -> T: ~const FnOnce(T) -> T>(self: &Self, f: impl ~const FnOnce(T) -> T) where T:Updates the contained value using a function.
Examples
use Cell; let c = new; c.update; assert_eq!;
impl<T: Default> Cell<T>
const fn take(self: &Self) -> T where T: ~const DefaultTakes the value of the cell, leaving
Default::default()in its place.Examples
use Cell; let c = new; let five = c.take; assert_eq!; assert_eq!;
impl<T> Any for Cell<T>
fn type_id(self: &Self) -> TypeId
impl<T> Borrow for Cell<T>
fn borrow(self: &Self) -> &T
impl<T> BorrowMut for Cell<T>
fn borrow_mut(self: &mut Self) -> &mut T
impl<T> CloneToUninit for Cell<T>
unsafe fn clone_to_uninit(self: &Self, dest: *mut u8)
impl<T> Freeze for Cell<T>
impl<T> From for Cell<T>
fn from(t: T) -> TReturns the argument unchanged.
impl<T> From for Cell<T>
fn from(t: never) -> T
impl<T> From for Cell<T>
fn from(t: T) -> Cell<T>Creates a new
Cell<T>containing the given value.
impl<T> RefUnwindSafe for Cell<T>
impl<T> Send for Cell<T>
impl<T> Unpin for Cell<T>
impl<T> UnwindSafe for Cell<T>
impl<T, U> Into for Cell<T>
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 Cell<T>
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto for Cell<T>
fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error>
impl<T: ?Sized> PinCoerceUnsized for Cell<T>
impl<T: ?Sized> Sync for Cell<T>
impl<T: CoerceUnsized<U>, U> CoerceUnsized for Cell<T>
impl<T: Copy + Debug> Debug for crate::cell::Cell<T>
fn fmt(self: &Self, f: &mut Formatter<'_>) -> Result
impl<T: Copy> Clone for Cell<T>
fn clone(self: &Self) -> Cell<T>
impl<T: DispatchFromDyn<U>, U> DispatchFromDyn for Cell<T>
impl<T: Eq + Copy> Eq for Cell<T>
impl<T: Ord + Copy> Ord for Cell<T>
fn cmp(self: &Self, other: &Cell<T>) -> Ordering
impl<T: PartialEq + Copy> PartialEq for Cell<T>
fn eq(self: &Self, other: &Cell<T>) -> bool
impl<T: PartialOrd + Copy> PartialOrd for Cell<T>
fn partial_cmp(self: &Self, other: &Cell<T>) -> Option<Ordering>fn lt(self: &Self, other: &Cell<T>) -> boolfn le(self: &Self, other: &Cell<T>) -> boolfn gt(self: &Self, other: &Cell<T>) -> boolfn ge(self: &Self, other: &Cell<T>) -> bool
impl<T: ~const Default> Default for Cell<T>
fn default() -> Cell<T>Creates a
Cell<T>, with theDefaultvalue for T.