【Rust】box と dyn の使い所

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) -> Box> + Send> + Send + Sync;
は、 dyn Fn(Request) は型が決まっていない Request という意味ですね。
Box<> は型が決まっていないのでヒープに保存。