Quand une fermeture implémente les traits Fn, FnMut et FnOnce en Rust ?
Bonjour, collègues ! J'ai commencé à étudier Rust et je n'arrive pas à comprendre les fermetures. Dans la documentation, il est écrit que chaque fermeture implémente automatiquement un ou plusieurs traits : `Fn`, `FnMut` et `FnOnce`. Mais je ne comprends pas de quoi cela dépend.
Supposons que j'ai un code simple :
```rust
let mut x = 5;
let add_to_x = |y| x += y; // fermeture qui mute x
let print_x = || println!("{}", x); // fermeture qui lit x
```
Pourquoi `add_to_x` ne peut-il pas être utilisé comme `Fn`, alors que `print_x` le peut ? Et quand une fermeture devient-elle `FnOnce` ? J'ai essayé de passer des fermetures à des fonctions avec différentes contraintes de traits, et le compilateur se plaint que le trait n'est pas implémenté.
Pouvez-vous m'expliquer simplement comment le compilateur Rust décide quel trait implémenter pour une fermeture ? Et comment cela affecte-t-il la possibilité d'appeler la fermeture plusieurs fois ou une seule fois ? Je serais reconnaissant pour des exemples avec différents scénarios de capture de variables. J'aimerais vraiment comprendre, car sans cela, je ne peux pas saisir comment