Struct std::cell::RefCell1.0.0[][src]

pub struct RefCell<T> where
    T: ?Sized
{ /* fields omitted */ }
Expand description

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

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

Implementations

创建一个包含 value 的新 RefCell

Examples
use std::cell::RefCell;

let c = RefCell::new(5);
Run

消耗 RefCell,返回包装的值。

Examples
use std::cell::RefCell;

let c = RefCell::new(5);

let five = c.into_inner();
Run

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

该函数对应于 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

用从 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

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

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

Panics

如果当前借用了任何一个 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

不变地借用包装的值。

借用一直持续到返回的 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

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

借用一直持续到返回的 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

可变地借用包装的值。

借用一直持续到返回的 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

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

借用一直持续到返回的 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

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

Examples
use std::cell::RefCell;

let c = RefCell::new(5);

let ptr = c.as_ptr();
Run

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

这个调用 (在编译时) 可变地借用 (在编译时),所以不需要动态检查。

但是要小心:此方法期望 self 是可变的,而使用 RefCell 时通常不是这样。

如果 self 不是可变的,那么请看一下 borrow_mut 方法。

另外,请注意,此方法仅适用于特殊情况,通常不是您想要的。 如有疑问,请改用 borrow_mut

Examples
use std::cell::RefCell;

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

assert_eq!(c, RefCell::new(6));
Run
🔬 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

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

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

获取包装的值,将 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

Panics

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

Panics

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

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

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

执行转换。

Panics

如果当前借用了任何一个 RefCell 中的值,就会出现 panic。

比较并返回两个值中的最大值。 Read more

比较并返回两个值中的最小值。 Read more

将值限制在某个时间间隔内。 Read more

Panics

如果当前借用了任何一个 RefCell 中的值,就会出现 panic。

此方法测试 !=

Panics

如果当前借用了任何一个 RefCell 中的值,就会出现 panic。

Panics

如果当前借用了任何一个 RefCell 中的值,就会出现 panic。

Panics

如果当前借用了任何一个 RefCell 中的值,就会出现 panic。

Panics

如果当前借用了任何一个 RefCell 中的值,就会出现 panic。

Panics

如果当前借用了任何一个 RefCell 中的值,就会出现 panic。

Auto Trait Implementations

Blanket Implementations

获取 selfTypeIdRead more

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

从拥有的值中借用。 Read more

执行转换。

执行转换。

执行转换。

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

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

🔬 This is a nightly-only experimental API. (toowned_clone_into #41263)

recently added

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

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

执行转换。

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

执行转换。