Box

Boxはヒープに割り当てられるポインタの所有権を持った物です。Box<T>として実装され、::new(x: T) -> Box<T>に渡されたxの型がTに入ります。

let box_str = Box::new("str");

"str"の型は&strなので、box_strの型は``std::boxed::Box<&str>`になります。

また、impl<T: ?Sized> Deref for Box<T>が実装されている為、Tが参照の場合デリファレンスでTを触れます。

let string: String = (*box_str).to_string();

*box_strがデリファレンスです。ここでstd::boxed::Box<&str>から&strに変換される為、strが持つ::to_string()を実行できます。

加えてBoximpl<T: ?Sized> Drop for Box<T>も実装されてます。これでスコープを抜ける時に自動でヒープ上のメモリを開放してくれる::dropを実装してます。

// snap
{
  let a_box = Box::new("a");
  // drop `a_box`
}
// snap

トレイトオブジェクトのラップ

Box<dyn Trait>とすることでトレイとオブジェクトな型の値を作成できます。

struct A(i32);

impl Is for A {
  fn is_true(&self) -> bool {
    self.0 > 0
  }
}

fn main() {
  let a: Box<dyn Is> = Box::new(A(33));
  println!("{}", a.is_true());
}