Callbacks idiomáticos em Rust: como passar funções e closures corretamente
Olá, colegas! Comecei a estudar Rust depois de C++ e não consigo entender como fazer callbacks corretamente. Em C++, eu simplesmente passava std::function ou um ponteiro para função. Aqui, tudo é mais rigoroso com ownership e lifetime.
Problema: quero escrever um handler de eventos simples. Tenho uma struct Button que deve chamar uma função personalizada ao ser pressionada. Em C++, eu faria assim:
```cpp
struct Button {
std::function onClick;
void press() { if(onClick) onClick(); }
};
```
Tentando reescrever em Rust:
```rust
struct Button {
callback: fn(), // tentando ponteiro para função
}
impl Button {
fn press(&self) {
(self.callback)();
}
}
```
Isso funciona apenas para funções comuns, mas não para closures que capturam variáveis. Se eu escrevo:
```rust
let mut count = 0;
let button = Button {
callback: || { count += 1; } // erro! tipo não corresponde
};
```
O compilador reclama: "expected fn item, found closure". Eu li sobre Box