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<> は型が決まっていないのでヒープに保存。