よりも長生きしません。「エラー:閉鎖は、現在の機能をより長生きする」が、私は次のコードをコンパイルしようとすると、それはそれを
error: closure may outlive the current function, but it borrows `should_end`, which is owned by the current function
私ができる」:私はこのエラーを取得する
fn main() {
(...)
let mut should_end = false;
let mut input = Input::new(ctx);
input.add_handler(Box::new(|evt| {
match evt {
&Event::Quit{..} => {
should_end = true;
}
_ => {}
}
}));
while !should_end {
input.handle();
}
}
pub struct Input {
handlers: Vec<Box<FnMut(i32)>>,
}
impl Input {
pub fn new() -> Self {
Input {handlers: Vec::new()}
}
pub fn handle(&mut self) {
for a in vec![21,0,3,12,1] {
for handler in &mut self.handlers {
handler(a);
}
}
}
pub fn add_handler(&mut self, handler: Box<FnMut(i32)>) {
self.handlers.push(handler);
}
}
を後でshould_end
をメインループに使用する必要があるので、move
をクロージャに単に追加してください。つまり、できますが、bool
はCopy
なので、クロージャー内のshould_end
にのみ影響し、プログラムは永遠にループします。
私が理解する限り、input
がmain関数で作成され、クロージャがinput
に格納されているため、現在の関数よりも寿命が長くなる可能性はありません。閉鎖が生き残れないことを錆に表現する方法はありますかmain
?あるいは、閉鎖がmain
よりも長くなることがわからない可能性はありますか?後者の場合、それはそれが生きるようにする方法がある限りmain
?
私は入力を処理する方法をリファクタリングする必要がありますか、または私はこの作業を行うことができます。私がリファクタリングする必要があるなら、どこでRustの良い例を見ることができますか?
ここにはa playpen of a simplified versionです。私はあなたのブラウザをクラッシュさせる可能性がある間違いを犯した可能性があります。私は一度私に起こったので、注意してください。
場合によっては、my code is availableの残りの部分が必要です。関連するすべての情報は、main.rs
またはinput.rs
のいずれかにする必要があります。
私はちょうど 'Cell'などをよく読んでする必要があります。そうでなければ、非常に徹底的な答え、ありがとう。 – MrNosco
暗黙の '' static''はどこから得られたのでしょうか? – starblue
iirc生存時間を指定しない場合は、関数の引数やローカルバインディングを除いて常に静的です。これは明らかに短い寿命を推測することができます –