Rustは非常に厳密かつ表現力が高いtraitというシステムを持っています。この中で特に初学者泣かせの項目が以下の3つのクロージャーtraitではないでしょうか?
FnOnce
FnMut
Fn
クロージャーを受け取る関数を作る際にどれを利用すればいいのかわからないし、自分が作ったクロージャーがどれになるのかも最初はよくわかりません。詳細な説明等は公式docや例えば以下の記事
などに書かれていますが、要は次のように理解すればいいです。
- クロージャーを作る際には内部的にはキャプチャした変数を無名構造体としてまとめている
- この構造体について一つだけメソッドが作られ、それのシグニチャを考えることでどのタイプのクロージャーになるかが決まる。
-
call(self)
-> selfがmoveされるため一度しかこのメソッドは利用できないのでFnOnce
-
call(&mut self)
-> 複数回利用できるが、利用するたびに内部状態が変化するのでFnMut
-
call(&self)
-> 複数回利用でき、内部状態も変化しないのでFn
-
これだけです。