Ответ 1
Каждый из этих признаков представляет все более ограничительные свойства о замыканиях/функциях, обозначенных сигнатурами их метода call_...
и, в частности, типом self
:
-
FnOnce
(self
) - это функции, которые можно вызывать один раз, -
FnMut
(&mut self
) - это функции, которые можно вызвать, если они имеют&mut
доступ к своей среде -
Fn
(&self
) - это функции, которые все еще можно вызвать, если они имеют только&
доступ к своей среде.
Закрытие |...| ...
будет автоматически реализовывать как можно больше из них.
- Все замыкания реализуют
FnOnce
: замыкание, которое нельзя вызвать один раз, не заслуживает имени. Обратите внимание, что если замыкание реализует толькоFnOnce
, его можно вызвать только один раз. - Замыкания, которые не выводятся из их захватов, реализуют
FnMut
, что позволяет их вызывать более одного раза (если есть нелизуемый доступ к объекту функции). - Закрытия, которые не требуют уникального/изменяемого доступа к их захватам, реализуют
Fn
, что позволяет их называть по существу везде.
Эти ограничения непосредственно следуют из типа self
и "desugaring" замыканий в структуры (описанные в Поиск закрытия в ржавчине).
Информацию о закрытии в Rust с 2017 года см. в разделе в разделе "Closures" в книге Rust.