Rust by Example

8.2.4 関数を受け取る関数

これまで、クロージャを引数として渡せることを見てきました。すると次の疑問が浮かんできます

「クロージャではない普通の関数を引数として渡すことは可能なのだろうか?」

可能です!とはいえ、通常の関数は絶対に周辺の変数を補足することができないので、クロージャの方がより柔軟な使い方ができます。ここから、クロージャを引数としてとる関数は、必ず通常の関数を引数としてとることができます。

// 関数を引数として取り、即座に実行する関数を定義 fn call_function<F: Fn()>(f: F) { f() } // 引数として渡すための簡単な関数を定義 fn print() { println!("I'm a function!") } fn main() { // 上で定義した`print()`に似たクロージャを定義 let closure = || println!("I'm a closure!"); call_function(closure); call_function(print); }

クロージャによる変数の補足がどのように行われているかを詳しく見たいときはFnFnMutFnOnceを参照してください。

See also:

Fn, FnMut, and FnOnce