関数呼び出しと戻り値がクロージャーの場合(@Rust)

https://kudohamu.hatenablog.com/entry/2015/09/26/084621

で、以下のようなコードが出てきて、なぜhoge()()と()が二重になるのかなと思いましたが、

fn main(){
    println!("{}", hoge()());
}

fn hoge() -> Box<dyn Fn() -> String> {
    Box::new(|| -> String {
        String::from("ほげー!")
    })
}

Geminiで質問すると、

hoge()だけだと関数呼び出すだけで、hoge()()としないと戻り値であるクロージャーの実行はできないと以下のように言われました。

まとめ:

hoge()() は、hoge 関数を呼び出し、その結果として得られたクロージャを呼び出すという二つの操作をまとめて実行しています。

「関数の戻り値としてのクロージャーを実行するなら二重括弧を使う」ということのようです

したがって、以下のように冗長に記述もできます。

    let abc = hoge();
    println!("{}", abc());

同じことは、クロージャーを戻り値にしている

https://isehara-3lv.sakura.ne.jp/blog/2024/04/05/クロージャーを戻り値にするrust/

のコードでも言えて、

    let fn_plain = create_fn(); // return a closure
    
    fn_plain();

と

    create_fn()();

は等価です

 

admin

カテゴリーRust