Struct std::cell::RefCell 1.0.0[−][src]
pub struct RefCell<T> where
T: ?Sized, { /* fields omitted */ }
Expand description
具有动态检查借用规则的可变内存位置
有关更多信息,请参见 模块级文档。
Implementations
将包装的值替换为新的值,并返回老的值,而无需对任何一个进行去初始化。
该函数对应于 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将 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();
Runpanic 的一个例子:
use std::cell::RefCell;
let c = RefCell::new(5);
let m = c.borrow_mut();
let b = c.borrow(); // 这导致 panic
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");
Runpanic 的一个例子:
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返回对底层数据的可变引用。
这个调用 (在编译时) 可变地借用 (在编译时),所以不需要动态检查。
但是要小心:此方法期望 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撤消泄漏的守卫对 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());
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