Box
L サイズがコンパイル時に決まらない型を使う時、dyn Traitを使う時、所有権を別の場所に移したいとき などに利用する
スタックではなく、ヒープに保存する
fn main() { let x = Box::new(77); println!("x = {}", x); }
### 再起的なデータ構造で、コンパイル時にサイズが決まらないケース
#[derive(Debug)] enum List { Cons(i32, Box<List>), Nil } use List::{Cons, Nil}; fn main() { let list = Cons(1, Box::new(Cons(2, Box::new(Cons(3, Box::new(Nil)))))); println!("{:?}", list); }
$ ./playground
Cons(1, Cons(2, Cons(3, Nil)))
### dyn Traitと一緒に使う
*/ trait Animal { fn speak(&self); } struct Dog; impl Animal for Dog { fn speak(&self) { println!("Woof!"); } } fn main() { let dog: Box<dyn Animal> = Box::new(Dog); dog.speak(); }
ヒープに確保せず、let dog = Dog; とした場合でも問題なく動くが、let dog の型を明示的に示す場合は、Box
つまり、
dyn Fn(Request
は、 dyn Fn(Request) は型が決まっていない Request という意味ですね。
Box<> は型が決まっていないのでヒープに保存。