impl traitはstaticである(@Rust)

クロージャーは動的(コンパイル時点でサイズが決まっていない)なので、コンパイル可能とするためにはBox<dyn fn() >の様な形でヒープエリアに割り当てることが必要ですが、imple traitにするだけで静的(static)として扱える様になると。以下のreturns_closureとreturns_closure0関数は同じことをやっていますが、impl Trait(ここではFnトレイト)を使うと静的になるので見かけはスッキリしています。

// imple "Trait" is static, so you don't need to use "Box dyn"
fn main() {

    fn returns_closure(y: i32) -> impl Fn(i32) -> i32 {
        move |x| x + y
    }

    fn returns_closure0(y: i32) -> Box<dyn fn(i32) -> i32> {
        Box::new(move |x| x + y)
    }

    println!("{}", returns_closure0(50)(10));
    println!("{}", returns_closure(50)(20));
}

 

admin

 

 

カテゴリーRust

“impl traitはstaticである(@Rust)” への1件の返信

コメントは受け付けていません。