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