Quando provo a compilare il codice seguente:"errore: chiusura può sopravvivere la funzione corrente", ma non sopravviverà lo
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);
}
}
ottengo questo errore:
error: closure may outlive the current function, but it borrows `should_end`, which is owned by the current function
posso' t semplicemente aggiungere move
alla chiusura, perché ho bisogno di utilizzare should_end
più avanti nel ciclo principale. Voglio dire, posso, ma dal momento che bool
è Copy
, interesserà solo lo should_end
all'interno della chiusura, e quindi il programma si riavvolge per sempre.
Per quanto ho capito, dal momento che input
viene creato nella funzione principale e la chiusura è memorizzata in input
, non è possibile che sopravviva la funzione corrente. C'è un modo per esprimere a Rust che la chiusura non sopravviverà a main
? O c'è la possibilità che non riesca a vedere che la chiusura sopravviverà a main
? In quest'ultimo caso, c'è un modo per costringerlo a vivere solo fino a quando main
?
Devo refactoring il modo in cui gestisco l'input, o c'è un modo in cui posso farlo funzionare. Se ho bisogno di un refactoring, dove posso cercare di vedere un buon esempio di questo in Rust?
Ecco a playpen of a simplified version. È possibile che ho commesso un errore che potrebbe causare l'arresto anomalo del browser. Mi è capitato una volta, quindi, attenzione.
Nel caso sia necessario, il resto di my code is available. Tutte le informazioni pertinenti devono essere in main.rs
o input.rs
.
ho solo bisogno di leggere su 'Cell' e così via. Altrimenti, risposta molto approfondita, grazie. – MrNosco
Da dove proviene questo '' static' implicito, è documentato da qualche parte? – starblue
iirc se non si specifica una durata è sempre ''statico' eccetto in argomenti di funzione e binding locali, che possono ovviamente inferire periodi di vita più brevi –