pub struct Cell<T>where
T: ?Sized,{ /* private fields */ }
std
only.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>
impl<T> Cell<T>
1.17.0 · Sourcepub fn swap(&self, other: &Cell<T>)
pub fn swap(&self, other: &Cell<T>)
Swaps the values of two Cell
s.
The difference with std::mem::swap
is that this function doesn’t
require a &mut
reference.
§Panics
This function will panic if self
and other
are different Cell
s that partially overlap.
(Using just standard library methods, it is impossible to create such partially overlapping Cell
s.
However, unsafe code is allowed to e.g. create two &Cell<[i32; 2]>
that partially overlap.)
§Examples
use std::cell::Cell;
let c1 = Cell::new(5i32);
let c2 = Cell::new(10i32);
c1.swap(&c2);
assert_eq!(10, c1.get());
assert_eq!(5, c2.get());
1.17.0 (const: unstable) · Sourcepub fn replace(&self, val: T) -> T
pub 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);
1.17.0 (const: 1.83.0) · Sourcepub const fn into_inner(self) -> T
pub const fn into_inner(self) -> T
Unwraps the value, consuming the cell.
§Examples
use std::cell::Cell;
let c = Cell::new(5);
let five = c.into_inner();
assert_eq!(five, 5);
Source§impl<T> Cell<T>where
T: Copy,
impl<T> Cell<T>where
T: Copy,
1.0.0 (const: unstable) · Sourcepub fn get(&self) -> T
pub 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();
Sourcepub fn update<F>(&self, f: F) -> Twhere
F: FnOnce(T) -> T,
🔬This is a nightly-only experimental API. (cell_update
)
pub fn update<F>(&self, f: F) -> Twhere
F: FnOnce(T) -> T,
cell_update
)Updates the contained value using a function and returns the new value.
§Examples
#![feature(cell_update)]
use std::cell::Cell;
let c = Cell::new(5);
let new = c.update(|x| x + 1);
assert_eq!(new, 6);
assert_eq!(c.get(), 6);
Source§impl<T> Cell<T>where
T: ?Sized,
impl<T> Cell<T>where
T: ?Sized,
1.12.0 (const: 1.32.0) · Sourcepub const fn as_ptr(&self) -> *mut T
pub const fn as_ptr(&self) -> *mut T
Returns a raw pointer to the underlying data in this cell.
§Examples
use std::cell::Cell;
let c = Cell::new(5);
let ptr = c.as_ptr();
1.11.0 (const: unstable) · Sourcepub fn get_mut(&mut self) -> &mut T
pub fn get_mut(&mut self) -> &mut T
Returns a mutable reference to the underlying data.
This call borrows Cell
mutably (at compile-time) which guarantees
that we possess the only reference.
However be cautious: this method expects self
to be mutable, which is
generally not the case when using a Cell
. If you require interior
mutability by reference, consider using RefCell
which provides
run-time checked mutable borrows through its borrow_mut
method.
§Examples
use std::cell::Cell;
let mut c = Cell::new(5);
*c.get_mut() += 1;
assert_eq!(c.get(), 6);
1.37.0 (const: unstable) · Sourcepub fn from_mut(t: &mut T) -> &Cell<T>
pub fn from_mut(t: &mut T) -> &Cell<T>
Returns a &Cell<T>
from a &mut T
§Examples
use std::cell::Cell;
let slice: &mut [i32] = &mut [1, 2, 3];
let cell_slice: &Cell<[i32]> = Cell::from_mut(slice);
let slice_cell: &[Cell<i32>] = cell_slice.as_slice_of_cells();
assert_eq!(slice_cell.len(), 3);
Source§impl<T> Cell<[T]>
impl<T> Cell<[T]>
1.37.0 (const: unstable) · Sourcepub fn as_slice_of_cells(&self) -> &[Cell<T>] ⓘ
pub fn as_slice_of_cells(&self) -> &[Cell<T>] ⓘ
Returns a &[Cell<T>]
from a &Cell<[T]>
§Examples
use std::cell::Cell;
let slice: &mut [i32] = &mut [1, 2, 3];
let cell_slice: &Cell<[i32]> = Cell::from_mut(slice);
let slice_cell: &[Cell<i32>] = cell_slice.as_slice_of_cells();
assert_eq!(slice_cell.len(), 3);
Source§impl<T, const N: usize> Cell<[T; N]>
impl<T, const N: usize> Cell<[T; N]>
Sourcepub const fn as_array_of_cells(&self) -> &[Cell<T>; N]
🔬This is a nightly-only experimental API. (as_array_of_cells
)
pub const fn as_array_of_cells(&self) -> &[Cell<T>; N]
as_array_of_cells
)Returns a &[Cell<T>; N]
from a &Cell<[T; N]>
§Examples
#![feature(as_array_of_cells)]
use std::cell::Cell;
let mut array: [i32; 3] = [1, 2, 3];
let cell_array: &Cell<[i32; 3]> = Cell::from_mut(&mut array);
let array_cell: &[Cell<i32>; 3] = cell_array.as_array_of_cells();
Trait Implementations§
§impl<F> ArchiveWith<Cell<F>> for Unsafewhere
F: Archive,
impl<F> ArchiveWith<Cell<F>> for Unsafewhere
F: Archive,
§fn resolve_with(
field: &Cell<F>,
resolver: <Unsafe as ArchiveWith<Cell<F>>>::Resolver,
out: Place<<Unsafe as ArchiveWith<Cell<F>>>::Archived>,
)
fn resolve_with( field: &Cell<F>, resolver: <Unsafe as ArchiveWith<Cell<F>>>::Resolver, out: Place<<Unsafe as ArchiveWith<Cell<F>>>::Archived>, )
F
.§impl<T, C> CheckBytes<C> for Cell<T>
impl<T, C> CheckBytes<C> for Cell<T>
Source§impl<T: ConstDefault> ConstDefault for Cell<T>
impl<T: ConstDefault> ConstDefault for Cell<T>
Source§impl<'de, T> Deserialize<'de> for Cell<T>where
T: Deserialize<'de> + Copy,
impl<'de, T> Deserialize<'de> for Cell<T>where
T: Deserialize<'de> + Copy,
Source§fn deserialize<D>(
deserializer: D,
) -> Result<Cell<T>, <D as Deserializer<'de>>::Error> ⓘwhere
D: Deserializer<'de>,
fn deserialize<D>(
deserializer: D,
) -> Result<Cell<T>, <D as Deserializer<'de>>::Error> ⓘwhere
D: Deserializer<'de>,
§impl<'a, T> Destructure for &'a Cell<T>where
T: ?Sized,
impl<'a, T> Destructure for &'a Cell<T>where
T: ?Sized,
§type Underlying = T
type Underlying = T
§type Destructuring = Borrow
type Destructuring = Borrow
§fn underlying(&mut self) -> *mut <&'a Cell<T> as Destructure>::Underlying
fn underlying(&mut self) -> *mut <&'a Cell<T> as Destructure>::Underlying
§impl<'a, T> Destructure for &'a mut Cell<T>where
T: ?Sized,
impl<'a, T> Destructure for &'a mut Cell<T>where
T: ?Sized,
§type Underlying = T
type Underlying = T
§type Destructuring = Borrow
type Destructuring = Borrow
§fn underlying(&mut self) -> *mut <&'a mut Cell<T> as Destructure>::Underlying
fn underlying(&mut self) -> *mut <&'a mut Cell<T> as Destructure>::Underlying
§impl<T> Destructure for Cell<T>
impl<T> Destructure for Cell<T>
§type Underlying = T
type Underlying = T
§type Destructuring = Move
type Destructuring = Move
§fn underlying(&mut self) -> *mut <Cell<T> as Destructure>::Underlying
fn underlying(&mut self) -> *mut <Cell<T> as Destructure>::Underlying
Source§impl<T> ExtCellOption<T> for Cell<Option<T>>
impl<T> ExtCellOption<T> for Cell<Option<T>>
Source§fn modify<F: FnOnce(T) -> T>(&self, func: F)
fn modify<F: FnOnce(T) -> T>(&self, func: F)
Cell<Option<T>>
by applying the provided closure
to a mutable reference of the current value if present. Read more§impl<'py, T> FromPyObject<'py> for Cell<T>where
T: FromPyObject<'py>,
impl<'py, T> FromPyObject<'py> for Cell<T>where
T: FromPyObject<'py>,
§impl<'py, T> IntoPyObject<'py> for &Cell<T>where
T: Copy + IntoPyObject<'py>,
impl<'py, T> IntoPyObject<'py> for &Cell<T>where
T: Copy + IntoPyObject<'py>,
§type Target = <T as IntoPyObject<'py>>::Target
type Target = <T as IntoPyObject<'py>>::Target
§type Output = <T as IntoPyObject<'py>>::Output
type Output = <T as IntoPyObject<'py>>::Output
§type Error = <T as IntoPyObject<'py>>::Error
type Error = <T as IntoPyObject<'py>>::Error
§fn into_pyobject(
self,
py: Python<'py>,
) -> Result<<&Cell<T> as IntoPyObject<'py>>::Output, <&Cell<T> as IntoPyObject<'py>>::Error> ⓘ
fn into_pyobject( self, py: Python<'py>, ) -> Result<<&Cell<T> as IntoPyObject<'py>>::Output, <&Cell<T> as IntoPyObject<'py>>::Error> ⓘ
§impl<'py, T> IntoPyObject<'py> for Cell<T>where
T: Copy + IntoPyObject<'py>,
impl<'py, T> IntoPyObject<'py> for Cell<T>where
T: Copy + IntoPyObject<'py>,
§type Target = <T as IntoPyObject<'py>>::Target
type Target = <T as IntoPyObject<'py>>::Target
§type Output = <T as IntoPyObject<'py>>::Output
type Output = <T as IntoPyObject<'py>>::Output
§type Error = <T as IntoPyObject<'py>>::Error
type Error = <T as IntoPyObject<'py>>::Error
§fn into_pyobject(
self,
py: Python<'py>,
) -> Result<<Cell<T> as IntoPyObject<'py>>::Output, <Cell<T> as IntoPyObject<'py>>::Error> ⓘ
fn into_pyobject( self, py: Python<'py>, ) -> Result<<Cell<T> as IntoPyObject<'py>>::Output, <Cell<T> as IntoPyObject<'py>>::Error> ⓘ
1.10.0 · Source§impl<T> Ord for Cell<T>
impl<T> Ord for Cell<T>
1.10.0 · Source§impl<T> PartialOrd for Cell<T>where
T: PartialOrd + Copy,
impl<T> PartialOrd for Cell<T>where
T: PartialOrd + Copy,
§impl<'a, T, U> Restructure<U> for &'a Cell<T>
impl<'a, T, U> Restructure<U> for &'a Cell<T>
§type Restructured = &'a Cell<U>
type Restructured = &'a Cell<U>
§unsafe fn restructure(
&self,
ptr: *mut U,
) -> <&'a Cell<T> as Restructure<U>>::Restructured ⓘ
unsafe fn restructure( &self, ptr: *mut U, ) -> <&'a Cell<T> as Restructure<U>>::Restructured ⓘ
§impl<'a, T, U> Restructure<U> for &'a mut Cell<T>
impl<'a, T, U> Restructure<U> for &'a mut Cell<T>
§type Restructured = &'a mut Cell<U>
type Restructured = &'a mut Cell<U>
§unsafe fn restructure(
&self,
ptr: *mut U,
) -> <&'a mut Cell<T> as Restructure<U>>::Restructured ⓘ
unsafe fn restructure( &self, ptr: *mut U, ) -> <&'a mut Cell<T> as Restructure<U>>::Restructured ⓘ
§impl<T, U> Restructure<U> for Cell<T>
impl<T, U> Restructure<U> for Cell<T>
§type Restructured = Cell<U>
type Restructured = Cell<U>
§unsafe fn restructure(
&self,
ptr: *mut U,
) -> <Cell<T> as Restructure<U>>::Restructured ⓘ
unsafe fn restructure( &self, ptr: *mut U, ) -> <Cell<T> as Restructure<U>>::Restructured ⓘ
Source§impl<T> Serialize for Cell<T>
impl<T> Serialize for Cell<T>
Source§fn serialize<S>(
&self,
serializer: S,
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error> ⓘwhere
S: Serializer,
fn serialize<S>(
&self,
serializer: S,
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error> ⓘwhere
S: Serializer,
§impl<F, S> SerializeWith<Cell<F>, S> for Unsafe
impl<F, S> SerializeWith<Cell<F>, S> for Unsafe
§impl<T> ToPyObject for Cell<T>where
T: Copy + ToPyObject,
impl<T> ToPyObject for Cell<T>where
T: Copy + ToPyObject,
impl<T, U> CoerceUnsized<Cell<U>> for Cell<T>where
T: CoerceUnsized<U>,
impl<T, U> DispatchFromDyn<Cell<U>> for Cell<T>where
T: DispatchFromDyn<U>,
impl<T> Eq for Cell<T>
impl<T> PinCoerceUnsized for Cell<T>where
T: ?Sized,
impl<T> PointerLike for Cell<T>where
T: PointerLike,
impl<T> Send for Cell<T>
impl<T> !Sync for Cell<T>where
T: ?Sized,
Auto Trait Implementations§
impl<T> !Freeze for Cell<T>
impl<T> !RefUnwindSafe for Cell<T>
impl<T> Unpin for Cell<T>
impl<T> UnwindSafe for Cell<T>where
T: UnwindSafe + ?Sized,
Blanket Implementations§
§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
§type ArchivedMetadata = ()
type ArchivedMetadata = ()
§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> ByteSized for T
impl<T> ByteSized for T
Source§const BYTE_ALIGN: usize = _
const BYTE_ALIGN: usize = _
Source§fn byte_align(&self) -> usize ⓘ
fn byte_align(&self) -> usize ⓘ
Source§fn ptr_size_ratio(&self) -> [usize; 2]
fn ptr_size_ratio(&self) -> [usize; 2]
Source§impl<T, R> Chain<R> for Twhere
T: ?Sized,
impl<T, R> Chain<R> for Twhere
T: ?Sized,
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.Source§impl<T> ExtAny for T
impl<T> ExtAny for T
Source§fn as_any_mut(&mut self) -> &mut dyn Anywhere
Self: Sized,
fn as_any_mut(&mut self) -> &mut dyn Anywhere
Self: Sized,
Source§impl<T> ExtMem for Twhere
T: ?Sized,
impl<T> ExtMem for Twhere
T: ?Sized,
Source§const NEEDS_DROP: bool = _
const NEEDS_DROP: bool = _
Source§fn mem_align_of_val(&self) -> usize ⓘ
fn mem_align_of_val(&self) -> usize ⓘ
Source§fn mem_size_of_val(&self) -> usize ⓘ
fn mem_size_of_val(&self) -> usize ⓘ
Source§fn mem_needs_drop(&self) -> bool
fn mem_needs_drop(&self) -> bool
true
if dropping values of this type matters. Read moreSource§fn mem_forget(self)where
Self: Sized,
fn mem_forget(self)where
Self: Sized,
self
without running its destructor. Read moreSource§fn mem_replace(&mut self, other: Self) -> Selfwhere
Self: Sized,
fn mem_replace(&mut self, other: Self) -> Selfwhere
Self: Sized,
Source§unsafe fn mem_zeroed<T>() -> T
unsafe fn mem_zeroed<T>() -> T
unsafe_layout
only.T
represented by the all-zero byte-pattern. Read moreSource§unsafe fn mem_transmute_copy<Src, Dst>(src: &Src) -> Dst
unsafe fn mem_transmute_copy<Src, Dst>(src: &Src) -> Dst
unsafe_layout
only.T
represented by the all-zero byte-pattern. Read moreSource§fn mem_as_bytes(&self) -> &[u8] ⓘ
fn mem_as_bytes(&self) -> &[u8] ⓘ
unsafe_slice
only.§impl<'py, T> FromPyObjectBound<'_, 'py> for Twhere
T: FromPyObject<'py>,
impl<'py, T> FromPyObjectBound<'_, 'py> for Twhere
T: FromPyObject<'py>,
§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
Source§impl<T> Hook for T
impl<T> Hook for T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more§impl<'py, T> IntoPyObjectExt<'py> for Twhere
T: IntoPyObject<'py>,
impl<'py, T> IntoPyObjectExt<'py> for Twhere
T: IntoPyObject<'py>,
§fn into_bound_py_any(self, py: Python<'py>) -> Result<Bound<'py, PyAny>, PyErr> ⓘ
fn into_bound_py_any(self, py: Python<'py>) -> Result<Bound<'py, PyAny>, PyErr> ⓘ
self
into an owned Python object, dropping type information.§impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
fn into_sample(self) -> T
§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError> ⓘ
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError> ⓘ
§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out
indicating that a T
is niched.