pub struct RefCell<T: ?Sized> { /* private fields */ }Expand description
具有动态检查借用规则的可变内存位置
有关更多信息,请参见 模块级文档。
Implementations§
source§impl<T> RefCell<T>
impl<T> RefCell<T>
const: unstable · sourcepub fn into_inner(self) -> T
pub fn into_inner(self) -> T
1.24.0 · sourcepub fn replace(&self, t: T) -> T
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));Run1.35.0 · sourcepub fn replace_with<F: FnOnce(&mut T) -> T>(&self, f: F) -> T
pub fn replace_with<F: FnOnce(&mut T) -> T>(&self, f: F) -> T
1.24.0 · sourcepub fn swap(&self, other: &Self)
pub fn swap(&self, other: &Self)
将 self 的包装值与 other 的包装值交换,而无需对任何一个进行去初始化。
该函数对应于 std::mem::swap。
Panics
如果当前借用了 RefCell 中的值,或者 self 和 other 指向相同的 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));Runsource§impl<T: ?Sized> RefCell<T>
impl<T: ?Sized> RefCell<T>
sourcepub fn borrow(&self) -> Ref<'_, T>
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();Runpanic 的一个例子:
1.13.0 · sourcepub fn try_borrow(&self) -> Result<Ref<'_, T>, BorrowError>
pub fn try_borrow(&self) -> Result<Ref<'_, T>, BorrowError>
sourcepub fn borrow_mut(&self) -> RefMut<'_, T>
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");Runpanic 的一个例子:
1.13.0 · sourcepub fn try_borrow_mut(&self) -> Result<RefMut<'_, T>, BorrowMutError>
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());Run1.11.0 · sourcepub fn get_mut(&mut self) -> &mut T
pub fn get_mut(&mut self) -> &mut T
返回对底层数据的可变引用。
由于此方法可变地借用 RefCell,因此静态保证不存在对底层数据的借用。
因此,不需要 borrow_mut 和 RefCell 的大多数其他方法中固有的动态检查。
只有在 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));Runsourcepub fn undo_leak(&mut self) -> &mut T
🔬This is a nightly-only experimental API. (cell_leak #69099)
pub fn undo_leak(&mut self) -> &mut T
cell_leak #69099)撤消泄漏的守卫对 RefCell 借用状态的影响。
这个调用与 get_mut 类似,但更专业。
它可变地借用 RefCell 以确保不存在借用,然后重置状态跟踪共享借用。
如果某些 Ref 或 RefMut 借用已被泄露,则这是相关的。
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());Run1.37.0 · sourcepub unsafe fn try_borrow_unguarded(&self) -> Result<&T, BorrowError>
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