出力パラメーターとして
クロージャを入力パラメーターとして使うことが可能なら、クロージャを 出力パラメーターとして返すことも可能なはずです。しかし、無名 クロージャ型は定義上不明であるため、それらを返すには impl Trait を使用する必要があります。
クロージャを返すために有効なトレイトは次のとおりです。
FnFnMutFnOnce
これに加えて、move キーワードを使用する必要があります。これは、すべてのキャプチャが 値によって行われることを示します。これが必要なのは、参照によるキャプチャがあると、 関数が終了した時点でそれらがドロップされ、クロージャ内に無効な参照が 残ってしまうためです。
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(); }
関連項目:
Fn、FnMut、ジェネリクス、および impl Trait。