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
}
Struct Parent
字段必须存储Option
:
struct Parent {
inner: Option</* magic */>
}
有必要暂时阻止在fn main()
中使用对象的可能性,直到您调用.unbind()
答案 0 :(得分:2)
借用检查器不可能在编译时证明这是正确的。但是你可以使用kivy
来确保它在运行时工作并且如果你做错了就会发生恐慌。您可以存储允许您修改对象的RefCell
,而不是在Parent对象中存储对象的引用。 RefMut
函数会引用bind
,如果对象已经被借用,则会发生混乱。
RefCell
答案 1 :(得分:0)
您还可以使用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);