クロージャーがFn
、FnMut
およびFnOnce
特性を実装するための特定の条件とは何ですか?
あれは:
FnOnce
特性を実装しますか?FnMut
特性を実装しますか?Fn
特性を実装しますか?たとえば、本体のクロージャの状態を変更すると、コンパイラはFn
を実装しません。
特性はそれぞれ、クロージャー/関数に関するますます制限的なプロパティを表し、call_...
メソッドのシグネチャ、特にself
のタイプによって示されます。
FnOnce
(self
)は1回呼び出すことができる関数です。FnMut
(&mut self
)は、環境に&mut
アクセスできる場合に呼び出すことができる関数ですFn
(&self
)は、環境へのアクセスが&
のみの場合に呼び出すことができる関数です。クロージャ|...| ...
は、できるだけ多くのものを自動的に実装します。
FnOnce
を実装します:一度呼び出せないクロージャーは名前に値しません。クロージャがFnOnce
のみを実装する場合、一度しか呼び出せないことに注意してください。FnMut
を実装し、複数回呼び出せるようにします(関数オブジェクトへのエイリアスのないアクセスがある場合)。Fn
を実装し、本質的にどこでも呼び出せるようにします。これらの制限は、self
の型とクロージャーの構造体への「脱糖」から直接に従います( Rustでのクロージャーの検索で説明 )。
Rust 2017年時点のクロージャーの詳細については、 Rust book)のクロージャーの章 を参照してください。