2016-11-08 6 views
4

私はちょうどRust(1.12)で何らかの行動を起こしました。説明できません。私はRefCell<Option<i32>>で遅延ロードを実装構造体やデータにアクセスする機能を持っている:`if`条件が本体に残っています

struct Foo { 
    data: RefCell<Option<i32>> 
} 

impl Foo { 
    fn get_data(&self) -> i32 { 
     if self.data.borrow().is_none() { // <--- (a) 
      let d = 1337; 
      self.data.borrow_mut() = Some(d); // <--- (b) 
      d 
     } else { 
      self.data.borrow().unwrap() 
     } 
    } 
} 

これは、ランタイムエラーをコンパイルしますが得られます。RefCellはライン上borrow_mutしようとしたときにボローがすでにアクティブであることを不平を言う(b)。私はif文を変更した場合の問題は、しかし、発生しません、次

let is_none = self.data.borrow().is_none(); 
if is_none { 

質問:ラインであれば条件でボローがあるのはなぜ(A)の体内まだアクティブ ifステートメント?私がboolに借りているのではなく、借りた金額だけを保持しているので、is_none()への呼び出しは終了しませんか?

+1

ベータ版とナイトリー版のように見えます。 https://play.rust-lang.org/?gist=450c131dcefde855ea0cbd832290e046&version=nightly&backtrace=0 – aSpex

答えて

5

これは、Rustの語彙借用範囲によるものです。

あなたが気づいたように、条件で何かを借りると、支店のためにそれを借りる。これはthis issueで議論されており、その後移動したhereです。

これは現在、Rust 1.13 Betaで修正されているため、次のサイクルでリリースされる可能性があります。