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&mut
acceso 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.