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

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

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

有关更多信息,请参见 module-level documentation

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

返回对基础数据的可变引用。

该调用借用 RefCell 是可变的 (在编译时),因此不需要动态检查。

但是要小心: 此方法期望 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

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

执行转换。

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

执行转换。