Struct std::cell::RefCell 1.0.0[−][src]
pub struct RefCell<T> where
T: ?Sized, { /* fields omitted */ }
Expand description
具有动态检查借用规则的可变内存位置
有关更多信息,请参见 module-level documentation。
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();Run
panic 的示例:
use std::cell::RefCell; let c = RefCell::new(5); let m = c.borrow_mut(); let b = c.borrow(); // 这导致 panicRun
可以借用包装的值。
借用一直持续到返回的 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(); // 这导致 panicRun
可变地借用包装的值,如果当前借用该值,则返回错误。
借用一直持续到返回的 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
返回对基础数据的可变引用。
该调用借用 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
撤消泄漏的守卫对 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