Quand une fermeture met-elle en œuvre Fn, FnMut et FnOnce?

Quelles sont les conditions spécifiques d’une fermeture pour mettre en œuvre les traits Fn , FnMut et FnOnce ?

C’est:

  • Quand une fermeture ne met-elle pas en œuvre le trait FnOnce ?
  • Quand une fermeture ne met-elle pas en œuvre le trait FnMut ?
  • Quand une fermeture ne met-elle pas en œuvre le trait Fn ?

Par exemple, si vous modifiez l’état de la fermeture sur son corps, le compilateur n’y implémentera pas Fn .

Les traits représentent chacun des propriétés de plus en plus ressortingctives sur les fermetures / fonctions, indiquées par les signatures de leur méthode d’ call_... , et en particulier du type de self :

  • FnOnce ( self ) sont des fonctions qui peuvent être appelées une fois,
  • FnMut ( &mut self ) sont des fonctions qui peuvent être appelées si elles ont un access &mut à leur environnement
  • Fn ( &self ) sont des fonctions qui peuvent encore être appelées si elles ne disposent que d’un access à leur environnement.

Une fermeture |...| ... |...| ... implémentera automatiquement autant que possible.

  • Toutes les fermetures implémentent FnOnce : une fermeture qui ne peut être appelée une seule fois ne mérite pas le nom. Notez que si une fermeture implémente uniquement FnOnce , elle ne peut être appelée qu’une seule fois.
  • Les fermetures qui ne sortent pas de leurs captures implémentent FnMut , ce qui leur permet d’être appelées plusieurs fois (si l’access à l’object fonction n’est pas correct).
  • Les fermetures qui n’ont pas besoin d’un access unique / modifiable à leurs captures implémentent Fn , leur permettant d’être appelées pratiquement partout.

Ces ressortingctions découlent directement du type de self et du “désuétude” des fermetures dans les structures (décrit dans la section Recherche de fermetures dans Rust ).

Pour plus d’informations sur les fermetures dans Rust à partir de 2017, reportez-vous au chapitre Fermetures du livre Rust .