Kiedy próbuję skompilować następujący kod:„Błąd: Zamknięcie może przeżyć bieżącą funkcję”, ale nie przeżyje to
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);
}
}
otrzymuję ten błąd:
error: closure may outlive the current function, but it borrows `should_end`, which is owned by the current function
mogę” t po prostu dodaj move
do zamknięcia, ponieważ muszę później użyć should_end
w pętli głównej. Mam na myśli, że mogę, ale ponieważ bool
jest Copy
, wpłynie to tylko na should_end
wewnątrz zamknięcia, a tym samym pętle programu na zawsze.
O ile rozumiem, ponieważ input
jest tworzony w głównej funkcji, a zamknięcie jest przechowywane w input
, nie może być możliwe przeżycie aktualnej funkcji. Czy istnieje sposób, aby wyrazić Rustowi, że zamknięcie nie przetrwa main
? A może jest taka możliwość, że nie widzę, aby zamknięcie przetrwało dłużej niż? W tym drugim przypadku, istnieje sposób na życie go tylko tak długo, jak main
?
Czy muszę refaktoryzować sposób, w jaki przetwarzam dane wejściowe, czy jest jakiś sposób, w jaki mogę wykonać tę pracę. Jeśli potrzebuję refaktoryzacji, gdzie mogę zobaczyć dobry przykład tego w Rust? Jest to a playpen of a simplified version. Możliwe, że popełniłem błąd, który mógł spowodować awarię przeglądarki. Zdarzyło mi się kiedyś, więc uważaj.
Jeśli jest to potrzebne, resztę my code is available. Wszystkie istotne informacje powinny być albo main.rs
lub input.rs
.
po prostu trzeba przeczytać na 'Cell' i takie. W przeciwnym razie, bardzo dokładna odpowiedź, dziękuję. – MrNosco
Skąd pochodzi ta ukryta "statyczna", czy gdzieś to udokumentowano? – starblue
iirc, jeśli nie określisz okresu istnienia, zawsze jest to ''static', z wyjątkiem argumentów funkcji i lokalnych powiązań, co oczywiście może sugerować krótsze okresy życia –