¿Cuándo un cierre implementa Fn, FnMut y FnOnce?

¿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 de 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 comstackdor no implemente Fn en él.

Los rasgos representan cada uno propiedades cada vez más restrictivas sobre cierres / funciones, indicadas por las firmas de su método de call_... , y particularmente el tipo de self :

  • FnOnce ( self ) son funciones que se pueden llamar una vez,
  • FnMut ( &mut self ) son funciones que se pueden FnMut si tienen acceso de &mut a su entorno
  • Fn ( &self ) son funciones que aún pueden invocarse si solo tienen acceso a su entorno.

Un cierre |...| ... |...| ... implementará automáticamente tantas como sea posible.

  • Todos los cierres implementan FnOnce : un cierre que no se puede llamar una vez no merece el nombre. Tenga en cuenta que si un cierre solo implementa FnOnce , solo se puede FnOnce una vez.
  • Los cierres que no se salgan de sus capturas implementan FnMut , lo que les permite ser llamados más de una vez (si hay acceso no asignado 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 del “desaglomerado” de los cierres en estructuras (que se describe en Cómo encontrar el cierre en el rust ).

Para obtener información sobre cierres en Rust a partir de 2017, consulte el capítulo Cierres en el libro Rust .