¿Cuándo un cierre implementa los traits Fn, FnMut y FnOnce en Rust?
¡Hola, colegas! Empecé a estudiar Rust y no puedo entender los cierres. En la documentación dice que cada cierre implementa automáticamente uno o más traits: `Fn`, `FnMut` y `FnOnce`. Pero no entiendo de qué depende.
Supongamos que tengo un código simple:
```rust
let mut x = 5;
let add_to_x = |y| x += y; // cierre que muta x
let print_x = || println!("{}", x); // cierre que lee x
```
¿Por qué `add_to_x` no puede usarse como `Fn`, pero `print_x` sí? ¿Y cuándo un cierre se convierte en `FnOnce`? Intenté pasar cierres a funciones con diferentes restricciones de traits, y el compilador se queja de que el trait no está implementado.
¿Pueden explicarme de manera sencilla cómo el compilador de Rust decide qué trait implementar para un cierre? ¿Y cómo afecta esto a si se puede llamar al cierre varias veces o solo una vez? Agradecería ejemplos con diferentes escenarios de captura de variables. Tengo muchas ganas de entenderlo, porque sin esto no puedo comprender cómo