¿Cuáles son las condiciones específicas para un cierre que ejecute el Fn
, FnMut
y FnOnce
rasgos?
Es decir:
- ¿Cuándo un cierre no implementa el
FnOnce
rasgo? - ¿Cuándo un cierre no implementa el
FnMut
rasgo? - ¿Cuándo un cierre no implementa el
Fn
rasgo?
Por ejemplo, mutar el estado del cierre en su cuerpo hace que el compilador no implemente Fn
en él.
Respuestas:
Cada uno de los rasgos representa propiedades cada vez más restrictivas sobre cierres / funciones, indicadas por las firmas de su
call_...
método, y particularmente el tipo deself
:FnOnce
(self
) son funciones que se pueden llamar una vezFnMut
(&mut self
) son funciones que se pueden llamar si tienen&mut
acceso a su entornoFn
(&self
) son funciones que se pueden llamar si solo tienen&
acceso a su entornoUn cierre
|...| ...
implementará automáticamente tantos como sea posible.FnOnce
: un cierre que no se puede llamar una vez no merece el nombre. Tenga en cuenta que si un cierre solo se implementaFnOnce
, solo se puede llamar una vez.FnMut
, lo que les permite ser llamados más de una vez (si hay acceso sin alias al objeto de función).Fn
, lo que les permite ser llamados esencialmente en todas partes.Estas restricciones se derivan directamente del tipo
self
y del "desugaring" de los cierres en estructuras; descrito en la publicación de mi blog Finding Closure in Rust .Para obtener información sobre cierres, consulte Cierres: funciones anónimas que pueden capturar su entorno en el lenguaje de programación Rust .
fuente
FnOnce
, ¿significa esto que solo se puede llamar una vez?FnOnce
".