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()
を実行できます。
加えてBox
はimpl<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 = Box::new(A(33));
println!("{}", a.is_true());
}