2015-11-06 49 views
1
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()

+1

有什麼問題在這裏:因爲一旦你綁定objparent2,它不能被parent1再使用? –

+0

@ T3H40在調用'.unbind()'之前,如何有必要暫時阻止在'fn main()'中使用該對象的可能性? – Heheyizi

+0

這是不可能的。該對象綁定,直到您放棄parent1:http://is.gd/8alczd –

回答

2

借用檢查器在編譯時無法證明這是正確的。但是如果你做錯了,你可以使用RefCell來確保它在運行時正常工作並且發生混亂。您可以存儲允許您修改對象的RefMut,而不是將對該對象的引用存儲在父對象中。 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); 
} 
0

您還可以確定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); 
+1

這是相反的。 「因爲在範圍關閉後你不能訪問'parent1',所以借用檢查器知道'parent1'不能再訪問'obj',所以你可以再次訪問'obj'。 –