暂时持有借来的物品
To temporarily hold the borrowed object
struct Parent<'a> {
inner: Option<&'a mut Object>
}
impl<'a> Parent<'a> {
fn new() -> Parent<'a> {
Parent {
inner: None,
}
}
fn bind(&mut self, obj: &'a mut Object) {
self.inner = Some(obj);
}
fn unbind(&mut self) {
self.inner = None;
}
}
struct Object {
inner: u32,
}
fn main() {
let mut obj = Object { inner: 0 };
let mut parent1 = Parent::new();
let mut parent2 = Parent::new();
parent1.bind(&mut obj);
parent1.unbind();
// parent2.bind(&mut obj);
// ^ error
}
结构 Parent
字段必须存储 Option
:
struct Parent {
inner: Option</* magic */>
}
有必要暂时阻止使用 fn main()
中的对象的可能性,直到您调用 .unbind()
借用检查器不可能在编译时证明这是正确的。但是你可以使用 RefCell
来确保它在运行时有效,如果你做错了会出现恐慌。您可以存储一个允许您修改对象的 RefMut
,而不是在 Parent 对象中存储对该对象的引用。 bind
函数引用了一个 RefCell
并且如果该对象已经被借用将会恐慌。
use std::cell::*;
struct Parent<'a> {
inner: Option<RefMut<'a, Object>>,
}
impl<'a> Parent<'a> {
fn new() -> Parent<'a> {
Parent {
inner: None,
}
}
fn bind(&mut self, obj: &'a RefCell<Object>) {
self.inner = Some(obj.borrow_mut());
}
fn unbind(&mut self) {
self.inner = None;
}
}
struct Object {
inner: u32,
}
fn main() {
let obj = RefCell::new(Object { inner: 0 });
let mut parent1 = Parent::new();
parent1.bind(&obj);
parent1.unbind(); // comment this line out and you get a runtime panic
let mut parent2 = Parent::new();
parent2.bind(&obj);
}
您还可以限定 parent1
的使用范围。一旦你将 obj
绑定到 parent2
,它就不能再被 parent1
使用了:
let mut obj = Object { inner: 0 };
{
let mut parent1 = Parent::new();
parent1.bind(&mut obj);
parent1.unbind();
}
let mut parent2 = Parent::new();
parent2.bind(&mut obj);
struct Parent<'a> {
inner: Option<&'a mut Object>
}
impl<'a> Parent<'a> {
fn new() -> Parent<'a> {
Parent {
inner: None,
}
}
fn bind(&mut self, obj: &'a mut Object) {
self.inner = Some(obj);
}
fn unbind(&mut self) {
self.inner = None;
}
}
struct Object {
inner: u32,
}
fn main() {
let mut obj = Object { inner: 0 };
let mut parent1 = Parent::new();
let mut parent2 = Parent::new();
parent1.bind(&mut obj);
parent1.unbind();
// parent2.bind(&mut obj);
// ^ error
}
结构 Parent
字段必须存储 Option
:
struct Parent {
inner: Option</* magic */>
}
有必要暂时阻止使用 fn main()
中的对象的可能性,直到您调用 .unbind()
借用检查器不可能在编译时证明这是正确的。但是你可以使用 RefCell
来确保它在运行时有效,如果你做错了会出现恐慌。您可以存储一个允许您修改对象的 RefMut
,而不是在 Parent 对象中存储对该对象的引用。 bind
函数引用了一个 RefCell
并且如果该对象已经被借用将会恐慌。
use std::cell::*;
struct Parent<'a> {
inner: Option<RefMut<'a, Object>>,
}
impl<'a> Parent<'a> {
fn new() -> Parent<'a> {
Parent {
inner: None,
}
}
fn bind(&mut self, obj: &'a RefCell<Object>) {
self.inner = Some(obj.borrow_mut());
}
fn unbind(&mut self) {
self.inner = None;
}
}
struct Object {
inner: u32,
}
fn main() {
let obj = RefCell::new(Object { inner: 0 });
let mut parent1 = Parent::new();
parent1.bind(&obj);
parent1.unbind(); // comment this line out and you get a runtime panic
let mut parent2 = Parent::new();
parent2.bind(&obj);
}
您还可以限定 parent1
的使用范围。一旦你将 obj
绑定到 parent2
,它就不能再被 parent1
使用了:
let mut obj = Object { inner: 0 };
{
let mut parent1 = Parent::new();
parent1.bind(&mut obj);
parent1.unbind();
}
let mut parent2 = Parent::new();
parent2.bind(&mut obj);