Struct std::cell::RefCell

1.0.0 · source ·
pub struct RefCell<T>where
    T: ?Sized,{ /* private fields */ }
Expand description

具有动态检查借用规则的可变内存位置

有关更多信息,请参见 模块级文档

Implementations§

source§

impl<T> RefCell<T>

const: 1.24.0 · source

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

创建一个包含 value 的新 RefCell

Examples
use std::cell::RefCell;

let c = RefCell::new(5);
Run
const: unstable · source

pub fn into_inner(self) -> T

消耗 RefCell,返回包装的值。

Examples
use std::cell::RefCell;

let c = RefCell::new(5);

let five = c.into_inner();
Run
1.24.0 · source

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

将包装的值替换为新的值,并返回老的值,而无需对任何一个进行去初始化。

该函数对应于 std::mem::replace

Panics

如果当前的值是借来的,就会出现 panic。

Examples
use std::cell::RefCell;
let cell = RefCell::new(5);
let old_value = cell.replace(6);
assert_eq!(old_value, 5);
assert_eq!(cell, RefCell::new(6));
Run
1.35.0 · source

pub fn replace_with<F>(&self, f: F) -> Twhere F: FnOnce(&mut T) -> T,

用从 f 计算出的新值替换包装后的值,并返回旧值,而无需对任何一个进行去初始化。

Panics

如果当前的值是借来的,就会出现 panic。

Examples
use std::cell::RefCell;
let cell = RefCell::new(5);
let old_value = cell.replace_with(|&mut old| old + 1);
assert_eq!(old_value, 5);
assert_eq!(cell, RefCell::new(6));
Run
1.24.0 · source

pub fn swap(&self, other: &RefCell<T>)

self 的包装值与 other 的包装值交换,而无需对任何一个进行去初始化。

该函数对应于 std::mem::swap

Panics

如果当前借用了 RefCell 中的值,或者 selfother 指向相同的 RefCell,则会出现 panic。

Examples
use std::cell::RefCell;
let c = RefCell::new(5);
let d = RefCell::new(6);
c.swap(&d);
assert_eq!(c, RefCell::new(6));
assert_eq!(d, RefCell::new(5));
Run
source§

impl<T> RefCell<T>where T: ?Sized,

source

pub fn borrow(&self) -> Ref<'_, T>

不变地借用包装的值。

借用一直持续到返回的 Ref 退出作用域为止。 可以同时取出多个不可变借用。

Panics

如果当前价值是可变借来的,就会出现 panic。 对于没有 panic 的变体,请使用 try_borrow

Examples
use std::cell::RefCell;

let c = RefCell::new(5);

let borrowed_five = c.borrow();
let borrowed_five2 = c.borrow();
Run

panic 的一个例子:

use std::cell::RefCell;

let c = RefCell::new(5);

let m = c.borrow_mut();
let b = c.borrow(); // 这导致 panic
Run
1.13.0 · source

pub fn try_borrow(&self) -> Result<Ref<'_, T>, BorrowError>

不可变地借用包装的值,如果当前可变地借用该值,则返回错误。

借用一直持续到返回的 Ref 退出作用域为止。 可以同时取出多个不可变借用。

这是 borrow 的没有 panic 的变体。

Examples
use std::cell::RefCell;

let c = RefCell::new(5);

{
    let m = c.borrow_mut();
    assert!(c.try_borrow().is_err());
}

{
    let m = c.borrow();
    assert!(c.try_borrow().is_ok());
}
Run
source

pub fn borrow_mut(&self) -> RefMut<'_, T>

可变地借用包装的值。

借用一直持续到返回的 RefMut 或从中衍生的所有 RefMut 退出作用域为止。

该借用处于活动状态时,不能借用该值。

Panics

如果当前的值是借来的,就会出现 panic。 对于没有 panic 的变体,请使用 try_borrow_mut

Examples
use std::cell::RefCell;

let c = RefCell::new("hello".to_owned());

*c.borrow_mut() = "bonjour".to_owned();

assert_eq!(&*c.borrow(), "bonjour");
Run

panic 的一个例子:

use std::cell::RefCell;

let c = RefCell::new(5);
let m = c.borrow();

let b = c.borrow_mut(); // 这导致 panic
Run
1.13.0 · source

pub fn try_borrow_mut(&self) -> Result<RefMut<'_, T>, BorrowMutError>

可变地借用包装的值,如果当前借用该值,则返回错误。

借用一直持续到返回的 RefMut 或从中衍生的所有 RefMut 退出作用域为止。 该借用处于活动状态时,不能借用该值。

这是 borrow_mut 的没有 panic 的变体。

Examples
use std::cell::RefCell;

let c = RefCell::new(5);

{
    let m = c.borrow();
    assert!(c.try_borrow_mut().is_err());
}

assert!(c.try_borrow_mut().is_ok());
Run
1.12.0 · source

pub fn as_ptr(&self) -> *mut T

返回指向此 cell 中底层数据的裸指针。

Examples
use std::cell::RefCell;

let c = RefCell::new(5);

let ptr = c.as_ptr();
Run
1.11.0 · source

pub fn get_mut(&mut self) -> &mut T

返回对底层数据的可变引用。

由于此方法可变地借用 RefCell,因此静态保证不存在对底层数据的借用。 因此,不需要 borrow_mutRefCell 的大多数其他方法中固有的动态检查。

只有在 RefCell 可以可变借用时才能调用此方法,通常只有在创建 RefCell 后直接调用。

在这些情况下,跳过上述动态借用检查可能会产生更好的人体工程学和运行时性能。

在大多数使用 RefCell 的情况下,它不能被可变借用。 然后使用 borrow_mut 来获取对底层数据的非法访问。

Examples
use std::cell::RefCell;

let mut c = RefCell::new(5);
*c.get_mut() += 1;

assert_eq!(c, RefCell::new(6));
Run
source

pub fn undo_leak(&mut self) -> &mut T

🔬This is a nightly-only experimental API. (cell_leak #69099)

撤消泄漏的守卫对 RefCell 借用状态的影响。

这个调用与 get_mut 类似,但更专业。 它可变地借用 RefCell 以确保不存在借用,然后重置状态跟踪共享借用。 如果某些 RefRefMut 借用已被泄露,则这是相关的。

Examples
#![feature(cell_leak)]
use std::cell::RefCell;

let mut c = RefCell::new(0);
std::mem::forget(c.borrow_mut());

assert!(c.try_borrow().is_err());
c.undo_leak();
assert!(c.try_borrow().is_ok());
Run
1.37.0 · source

pub unsafe fn try_borrow_unguarded(&self) -> Result<&T, BorrowError>

不可变地借用包装的值,如果当前可变地借用该值,则返回错误。

Safety

RefCell::borrow 不同,此方法是不安全的,因为它不返回 Ref,从而使借用标志保持不变。 当此方法返回的引用仍然有效时,借用 RefCell 是未定义的行为。

Examples
use std::cell::RefCell;

let c = RefCell::new(5);

{
    let m = c.borrow_mut();
    assert!(unsafe { c.try_borrow_unguarded() }.is_err());
}

{
    let m = c.borrow();
    assert!(unsafe { c.try_borrow_unguarded() }.is_ok());
}
Run
source§

impl<T> RefCell<T>where T: Default,

1.50.0 · source

pub fn take(&self) -> T

获取包装的值,将 Default::default() 留在其位置。

Panics

如果当前的值是借来的,就会出现 panic。

Examples
use std::cell::RefCell;

let c = RefCell::new(5);
let five = c.take();

assert_eq!(five, 5);
assert_eq!(c.into_inner(), 0);
Run

Trait Implementations§

source§

impl<T> Clone for RefCell<T>where T: Clone,

source§

fn clone(&self) -> RefCell<T>

Panics

如果当前价值是可变借来的,就会出现 panic。

source§

fn clone_from(&mut self, other: &RefCell<T>)

Panics

如果当前 other 是可变借用的,就会出现 panic。

source§

impl<T> Debug for RefCell<T>where T: Debug + ?Sized,

source§

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

使用给定的格式化程序格式化该值。 Read more
source§

impl<T> Default for RefCell<T>where T: Default,

source§

fn default() -> RefCell<T>

创建一个 RefCell<T>,其 T 值为 Default

1.12.0 · source§

impl<T> From<T> for RefCell<T>

source§

fn from(t: T) -> RefCell<T>

创建一个包含给定值的新 RefCell<T>

1.10.0 · source§

impl<T> Ord for RefCell<T>where T: Ord + ?Sized,

source§

fn cmp(&self, other: &RefCell<T>) -> Ordering

Panics

如果 RefCell 中的值当前被可变地借用,则会出现 panic。

source§

impl<T> PartialEq<RefCell<T>> for RefCell<T>where T: PartialEq<T> + ?Sized,

source§

fn eq(&self, other: &RefCell<T>) -> bool

Panics

如果 RefCell 中的值当前被可变地借用,则会出现 panic。

source§

fn ne(&self, other: &Rhs) -> bool

此方法测试 !=。 默认实现几乎总是足够的,并且不应在没有充分理由的情况下被覆盖。
1.10.0 · source§

impl<T> PartialOrd<RefCell<T>> for RefCell<T>where T: PartialOrd<T> + ?Sized,

source§

fn partial_cmp(&self, other: &RefCell<T>) -> Option<Ordering>

Panics

如果 RefCell 中的值当前被可变地借用,则会出现 panic。

source§

fn lt(&self, other: &RefCell<T>) -> bool

Panics

如果 RefCell 中的值当前被可变地借用,则会出现 panic。

source§

fn le(&self, other: &RefCell<T>) -> bool

Panics

如果 RefCell 中的值当前被可变地借用,则会出现 panic。

source§

fn gt(&self, other: &RefCell<T>) -> bool

Panics

如果 RefCell 中的值当前被可变地借用,则会出现 panic。

source§

fn ge(&self, other: &RefCell<T>) -> bool

Panics

如果 RefCell 中的值当前被可变地借用,则会出现 panic。

source§

impl<T, U> CoerceUnsized<RefCell<U>> for RefCell<T>where T: CoerceUnsized<U>,

1.2.0 · source§

impl<T> Eq for RefCell<T>where T: Eq + ?Sized,

source§

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

source§

impl<T> !Sync for RefCell<T>where T: ?Sized,

Auto Trait Implementations§

§

impl<T> !RefUnwindSafe for RefCell<T>

§

impl<T: ?Sized> Unpin for RefCell<T>where T: Unpin,

§

impl<T: ?Sized> UnwindSafe for RefCell<T>where T: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

获取 selfTypeIdRead more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

从拥有的值中一成不变地借用。 Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

从拥有的值中借用。 Read more
source§

impl<T> From<!> for T

source§

fn from(t: !) -> T

从输入类型转换为此类型。
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

返回未更改的参数。

source§

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

source§

fn into(self) -> U

调用 U::from(self)

也就是说,这种转换是 From<T> for U 实现选择执行的任何操作。

source§

impl<T> ToOwned for Twhere T: Clone,

§

type Owned = T

获得所有权后的结果类型。
source§

fn to_owned(&self) -> T

从借用的数据创建拥有的数据,通常是通过克隆。 Read more
source§

fn clone_into(&self, target: &mut T)

使用借来的数据来替换拥有的数据,通常是通过克隆。 Read more
source§

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

§

type Error = Infallible

发生转换错误时返回的类型。
source§

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

执行转换。
source§

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

§

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

发生转换错误时返回的类型。
source§

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

执行转换。