2016-12-05 11 views
0

錆ブックに基づいて、次のコードは、closure may outlive the current functionエラーが発生することができますクロージャが現在の関数よりも長生きする例を提供できますか?

use std::thread; 

fn main() { 
    let x = 1; 
    thread::spawn(|| { 
     println!("x is {}", x); 
    }); 
} 

いつ、どのようにクロージャは現在の関数が起こるより長生きだと思うし、抽象です。すべての例や仕様を提供できますか?

答えて

5

クロージャをスレッドに移動してスレッドが現在の機能よりも長持ちすることがあるため(機能エンドに自動的には参加しません)、crossbeamクレートを使用してください。ヒープ。

次のコードを見ると、クロージャをヒープに移動して戻すことが禁止されていることがわかります。スレッドは基本的に借用に関して同じものなので、スレッド内の何も参照することはできません。

help: to force the closure to take ownership of `x` (and any other referenced variables), use the `move` keyword, as shown: 
    |  Box::new(move || { 
+0

スーパー効果:コンパイラはエラーメッセージで問題の解決策を与えること

fn foo() -> Box<FnOnce()> { let x = 1; Box::new(|| { println!("x is {}", x); }) } fn main() { let f = foo(); } 

は注意してください。ありがとう! – enaJ

+0

コンパイラはスレッドのための 'move'ソリューションも提供する必要があります。 – belst

関連する問題