クロージャーは動的(コンパイル時点でサイズが決まっていない)なので、コンパイル可能とするためには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
“impl traitはstaticである(@Rust)” への1件の返信
コメントは受け付けていません。