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