返り値として
クロージャを引数として取ることができるのなら、クロージャを返す
こともできるはずです。しかし、匿名なクロージャの型は、定義時点では
不明です。そのため、クロージャを返すにはimpl Traitを使う必要が
あります。
クロージャを返すのに使われるトレイトは以下の通りです。
FnFnMutFnOnce
キャプチャしている値をすべて渡すため、moveキーワードが必要です。これがないと
変数は関数終了と同時にdropされ、クロージャ内のキャプチャしている参照が無効に
なります。
fn create_fn() -> impl Fn() { let text = "Fn".to_owned(); move || println!("This is a: {}", text) } fn create_fnmut() -> impl FnMut() { let text = "FnMut".to_owned(); move || println!("This is a: {}", text) } fn create_fnonce() -> impl FnOnce() { let text = "FnOnce".to_owned(); move || println!("This is a: {}", text) } fn main() { let fn_plain = create_fn(); let mut fn_mut = create_fnmut(); let fn_once = create_fnonce(); fn_plain(); fn_mut(); fn_once(); }