- 362 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 21:22:53.78 ID:NwYcCv97.net]
- >>349
Boxとはヒープを使うということです Rustではコードで明示的に指定しない限り勝手にヒープが使われることはないです (もちろんBox以外にもVecやStringなどヒープを使うものを使ってもそれは明示的に指定したことになります) その Box<Fn(i32) -> i32> は今は Box<dyn Fn(i32) -> i32> と書く必要があります では本題の impl Fn(i32) -> i32 と書いた場合はどうなるのでしょうか? 以下のように3種類のクロージャを作ってサイズや型を表示させてみると fn main() { let direct_closure = |x: i32| x + 1; let impl_closure = make_impl_closure(); let box_closure = make_box_closure(); println!("{} {}", std::mem::size_of_val(&direct_closure), type_of(&direct_closure)); println!("{} {}", std::mem::size_of_val(&impl_closure), type_of(&impl_closure)); println!("{} {}", std::mem::size_of_val(&box_closure), type_of(&box_closure)); } fn make_impl_closure() -> impl Fn(i32) -> i32 { |x| x + 1 } fn make_box_closure() -> Box<dyn Fn(i32) -> i32> { Box::new(|x| x + 1) } fn type_of<T>(_: &T) -> &'static str { std::any::type_name::<T>() } 実行結果は以下のように表示されます 0 tmp::main::{{closure}} 0 tmp::make_impl_closure::{{closure}} 16 alloc::boxed::Box<dyn core::ops::function::Fn<(i32,)>+Output = i32> つまりimplでは直接クロージャ指定したのと全く同じです (上記では定義した関数名だけが異なる)
|

|