Quelles sont les conditions spécifiques d'une fermeture pour implémenter les traits Fn
, FnMut
et FnOnce
?
C'est:
- Quand une fermeture ne met-elle pas en œuvre le
FnOnce
trait? - Quand une fermeture ne met-elle pas en œuvre le
FnMut
trait? - Quand une fermeture ne met-elle pas en œuvre le
Fn
trait?
Par exemple, la mutation de l'état de la fermeture sur son corps empêche le compilateur de l'implémenter Fn
.
Réponses:
Les traits représentent chacun des propriétés de plus en plus restrictives sur les fermetures / fonctions, indiquées par les signatures de leur
call_...
méthode, et notamment le type deself
:FnOnce
(self
) sont des fonctions qui peuvent être appelées une foisFnMut
(&mut self
) sont des fonctions qui peuvent être appelées si elles ont&mut
accès à leur environnementFn
(&self
) sont des fonctions qui peuvent être appelées si elles n'ont&
accès qu'à leur environnementUne fermeture
|...| ...
implémentera automatiquement autant de ceux-ci que possible.FnOnce
: une fermeture qui ne peut pas être appelée une fois ne mérite pas ce nom. Notez que si une fermeture n'est implémentée queFnOnce
, elle ne peut être appelée qu'une seule fois.FnMut
, ce qui leur permet d'être appelées plus d'une fois (s'il y a un accès sans alias à l'objet fonction).Fn
, ce qui leur permet d'être appelées pratiquement partout.Ces restrictions découlent directement du type
self
et du "désugarage" des fermetures en structures; décrit dans mon article de blog Finding Closure in Rust .Pour plus d'informations sur les fermetures, consultez Fermetures: fonctions anonymes pouvant capturer leur environnement dans le langage de programmation Rust .
la source
FnOnce
, cela signifie-t-il qu'elle ne peut être appelée qu'une seule fois?FnOnce
".