Каждая черта представляет все более и более ограничительные свойства замыканий / функций, обозначенных сигнатурами их call_...
метода, и в частности типом self
:
FnOnce
( self
) - это функции, которые можно вызвать один раз
FnMut
( &mut self
) - это функции, которые можно вызывать, если у них есть &mut
доступ к своей среде.
Fn
( &self
) - это функции, которые можно вызывать, если они имеют &
доступ только к своей среде.
Закрытие |...| ...
автоматически реализует столько из них, сколько может.
- Все замыкания реализуются
FnOnce
: закрытие, которое нельзя вызвать один раз, не заслуживает названия. Обратите внимание: если замыкание реализуется только FnOnce
, его можно вызвать только один раз.
- Замыкания, которые не выходят за пределы своих захватов, реализуют
FnMut
, позволяя вызывать их более одного раза (если есть несанкционированный доступ к объекту функции).
- Замыкания, которые не нуждаются в уникальном / изменяемом доступе к их захватам, реализуют
Fn
, что позволяет их вызывать практически везде.
Эти ограничения прямо вытекают из типа self
и «обессахаривания» замыканий в структуры; описано в моем сообщении в блоге Finding Closure in Rust .
Для получения информации о замыканиях см. Закрытие: анонимные функции, которые могут захватывать свое окружение на языке программирования Rust .