Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

出力パラメーターとして

クロージャを入力パラメーターとして使うことが可能なら、クロージャを 出力パラメーターとして返すことも可能なはずです。しかし、無名 クロージャ型は定義上不明であるため、それらを返すには impl Trait を使用する必要があります。

クロージャを返すために有効なトレイトは次のとおりです。

  • Fn
  • FnMut
  • FnOnce

これに加えて、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();
}

関連項目:

FnFnMutジェネリクス、および impl Trait