pub struct RefCell<T>where
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>(&self, f: F) -> Twhere
F: FnOnce(&mut T) -> T,
pub fn replace_with<F>(&self, f: F) -> Twhere F: FnOnce(&mut T) -> T,
1.24.0 · sourcepub fn swap(&self, other: &RefCell<T>)
pub fn swap(&self, other: &RefCell<T>)
将 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> RefCell<T>where
T: ?Sized,
impl<T> RefCell<T>where T: ?Sized,
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