rust closures

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 implementa FnOnce , 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.