Quand une fermeture implémente Fn, FnMut et FnOnce en Rust ?
Je suis débutant en Rust et j'essaie de comprendre les fermetures. J'ai lu sur les traits Fn, FnMut et FnOnce, mais je ne comprends pas complètement quand le compilateur choisit lequel. J'ai écrit un petit exemple :
```rust
fn main() {
let x = 10;
let print_x = || println!("{}", x); // Fermeture 1
let mut y = String::from("hello");
let append = || y.push_str(" world"); // Fermeture 2
let z = String::from("rust");
let consume = || drop(z); // Fermeture 3
}
```
Pourquoi la première fermeture fonctionne comme Fn, la deuxième comme FnMut, et la troisième comme FnOnce ? Et comment cela affecte-t-il le nombre de fois que je peux appeler la fermeture ? Si je passe une telle fermeture à une fonction, comment savoir quel trait elle attend ? Je serais reconnaissant pour une explication avec des exemples.
<<>>
Réponse courte : tout dépend de la façon dont la fermeture utilise les variables capturées
Le compilateur Rust détermine automatiquement lequel des trois traits la fermeture implémente, en fonction de ce qu'elle fait avec les variables capturées depuis l'extérieur.