#[repr(transparent)]pub struct Cell<T>where
T: ?Sized,{ /* private fields */ }
Expand description
可变的内存位置。
内存布局
Cell<T>
具有与 UnsafeCell<T>
](UnsafeCell#memory-layout) 相同的 [内存布局和注意事项。
特别是,这意味着 Cell<T>
与其内部类型 T
具有相同的内存表示。
Examples
在这个例子中,您可以看到 Cell<T>
在一个不可变的结构中实现了变异。
换句话说,它实现了内部可变性。
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` 是不可变 my_struct.regular_field =new_value;
// WORKS: 尽管 `my_struct` 是不可变的,但是 `special_field` 是 `Cell`,可以随时对其进行修改
my_struct.special_field.set(new_value);
assert_eq!(my_struct.special_field.get(), new_value);
Run有关更多信息,请参见 模块级文档。
Implementations§
source§impl<T> Cell<T>
impl<T> Cell<T>
source§impl<T> Cell<T>where
T: ?Sized,
impl<T> Cell<T>where T: ?Sized,
1.11.0 · sourcepub fn get_mut(&mut self) -> &mut T
pub fn get_mut(&mut self) -> &mut T
返回对底层数据的可变引用。
这个调用可变地 (在编译时) 借用了 Cell
,这保证了我们拥有唯一的引用。
但是要小心:此方法要求 self
是可变的,而使用 Cell
时通常不是这种情况。
如果您需要通过引用实现内部可变性,可以考虑使用 RefCell
,它通过其 borrow_mut
方法提供运行时检查的可变借用。
Examples
use std::cell::Cell;
let mut c = Cell::new(5);
*c.get_mut() += 1;
assert_eq!(c.get(), 6);
RunTrait Implementations§
1.10.0 · source§impl<T> PartialOrd<Cell<T>> for Cell<T>where
T: PartialOrd<T> + Copy,
impl<T> PartialOrd<Cell<T>> for Cell<T>where T: PartialOrd<T> + Copy,
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>where T: Eq + Copy,
impl<T> Send for Cell<T>where T: Send + ?Sized,
impl<T> !Sync for Cell<T>where T: ?Sized,
Auto Trait Implementations§
impl<T> !RefUnwindSafe for Cell<T>
impl<T: ?Sized> Unpin for Cell<T>where T: Unpin,
impl<T: ?Sized> UnwindSafe for Cell<T>where T: UnwindSafe,
Blanket Implementations§
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
从拥有的值中借用。 Read more