Подтвердить что ты не робот

Когда реализуются блокировки Fn, FnMut и FnOnce?

Каковы особые условия для закрытия для реализации признаков Fn, FnMut и FnOnce?

То есть:

  • Когда закрытие не реализует черту FnOnce?
  • Когда закрытие не реализует черту FnMut?
  • Когда закрытие не реализует черту Fn?

Например, при изменении состояния закрытия на нем тело компилятора не реализует Fn на нем.

4b9b3361

Ответ 1

Каждый из этих признаков представляет все более ограничительные свойства о замыканиях/функциях, обозначенных сигнатурами их метода call_... и, в частности, типом self:

  • FnOnce (self) - это функции, которые можно вызывать один раз,
  • FnMut (&mut self) - это функции, которые можно вызвать, если они имеют &mut доступ к своей среде
  • Fn (&self) - это функции, которые все еще можно вызвать, если они имеют только & доступ к своей среде.

Закрытие |...| ... будет автоматически реализовывать как можно больше из них.

  • Все замыкания реализуют FnOnce: замыкание, которое нельзя вызвать один раз, не заслуживает имени. Обратите внимание, что если замыкание реализует только FnOnce, его можно вызвать только один раз.
  • Замыкания, которые не выводятся из их захватов, реализуют FnMut, что позволяет их вызывать более одного раза (если есть нелизуемый доступ к объекту функции).
  • Закрытия, которые не требуют уникального/изменяемого доступа к их захватам, реализуют Fn, что позволяет их называть по существу везде.

Эти ограничения непосредственно следуют из типа self и "desugaring" замыканий в структуры (описанные в Поиск закрытия в ржавчине).

Информацию о закрытии в Rust с 2017 года см. в разделе в разделе "Closures" в книге Rust.