Avatar ·

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