暂时保留借来的对象

时间:2015-11-06 08:23:45

标签: rust mutability borrow-checker borrowing

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()

2 个答案:

答案 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);