2016-07-17 5 views
1

クロージャの内側からクロージャの外側で定義された変数を変更するにはどうすればよいですか?クロージャの内側からクロージャの外側で定義された変数を変更するにはどうすればよいですか?

コード:

fn main() { 
    let mut t = "foo".to_string(); 
    println!("{}", t); 

    let mut closure = | | { 
     t.clear(); 
    }; 
    closure(); 

    println!("{}", t); 
} 

コンパイルエラー:あなたがやったとおりに

cannot borrow `t` as immutable because it is also borrowed as mutable [--explain E0502] 

答えて

2

。それはここでは問題ではありません。

error: cannot borrow `t` as immutable because it is also borrowed as mutable [--explain E0502] 
    |>   let mut closure = || { 
    |>       -- mutable borrow occurs here 
    |>    t.clear(); 
    |>    - previous borrow occurs due to use of `t` in closure 
... 
    |>  println!("{}", t); 
    |>     ^immutable borrow occurs here 
    |> } 
    |> - mutable borrow ends here 

変数の可変参照がクローズに指定されており、クロージャがまだ有効範囲にあります。つまり、参照が保持され、変数への参照は他にはできません。これは、同じ問題を示しています。小さなスコープでクロージャを作成

fn main() { 
    let mut t = "foo".to_string(); 
    println!("> {}", t); 
    let not_a_closure = &mut t; 
    println!("> {}", t); 
} 

がスコープの外に出るとprintln!への呼び出しの前に参照を解放するために閉鎖を強制的に:

fn main() { 
    let mut t = "foo".to_string(); 
    println!("> {}", t); 

    { 
     let mut closure = || { 
      t.clear(); 
     }; 
     closure(); 
    } 

    println!("> {}", t); 
} 

私は見てお勧めしたいですエラーの詳細については、60+ other questions with the same error messageを参照してください。

+0

それは私のSSCCEを解決しますが、実際のコードでは問題は解決しません。それをさらに調べなければならないだろう。ありがとうございました。 – Michael

+0

@Michael私たちは次の質問を楽しみにしています!^_ ^ – Shepmaster

関連する問題