Callbacks idiomáticos en Rust: cómo pasar correctamente funciones y closures
¡Hola, colegas! Empecé a estudiar Rust después de C++ y no puedo entender cómo hacer callbacks correctamente. En C++ simplemente pasaba std::function o un puntero a función. Aquí todo es más estricto con la propiedad y el tiempo de vida.
Problema: quiero escribir un manejador de eventos simple. Tengo una estructura Button que debe llamar a una función personalizada al presionarlo. En C++ lo haría así:
```cpp
struct Button {
std::function onClick;
void press() { if(onClick) onClick(); }
};
```
Intento reescribirlo en Rust:
```rust
struct Button {
callback: fn(), // pruebo con puntero a función
}
impl Button {
fn press(&self) {
(self.callback)();
}
}
```
Esto funciona solo para funciones normales, pero no para closures que capturan variables. Si escribo:
```rust
let mut count = 0;
let button = Button {
callback: || { count += 1; } // ¡error! el tipo no coincide
};
```
El compilador se queja: "expected fn item, found closure". He leído sobre Box