rust - ¿Cuándo un cierre implementa Fn, FnMut y FnOnce?
closures (1)
Cada uno de los rasgos representa propiedades cada vez más restrictivas sobre los cierres / funciones, indicadas por las firmas de su método
call_...
, y particularmente el tipo de
self
:
-
FnOnce(self) son funciones a las que se puede llamar una vez, -
FnMut(&mut self) son funciones a las que se puede llamar si tienen&mutacceso a su entorno -
Fn(&self) son funciones a las que aún se puede llamar si solo tienen acceso a su entorno.
Un cierre
|...| ...
|...| ...
implementará automáticamente tantos como sea posible.
-
Todos los cierres implementan
FnOnce: un cierre al que no se puede llamar una vez no merece el nombre. Tenga en cuenta que si un cierre solo implementaFnOnce, solo se puede llamar una vez. -
Los cierres que no se mueven fuera de sus capturas implementan
FnMut, lo que les permite ser llamados más de una vez (si hay acceso sin alias al objeto de función). -
Los cierres que no necesitan acceso único / mutable a sus capturas implementan
Fn, lo que les permite ser llamados esencialmente en todas partes.
Estas restricciones se derivan directamente del tipo de
self
y el "desugarse" de los cierres en estructuras (descritas en
Finding Closure in Rust
).
Para obtener información sobre cierres en Rust a partir de 2017, consulte el capítulo Cierres en el libro Rust .
¿Cuáles son las
condiciones específicas
para que un cierre implemente los rasgos
Fn
,
FnMut
y
FnOnce
?
Es decir:
-
¿Cuándo un cierre
no
implementa el rasgo
FnOnce? -
¿Cuándo un cierre
no
implementa el rasgo
FnMut? -
¿Cuándo un cierre
no
implementa el rasgo
Fn?
Por ejemplo, mutar el estado del cierre en su cuerpo hace que el compilador no implemente
Fn
en él.