サーチ…


前書き

ボックスは、ルストの非常に重要な部分であり、すべての錆びた人は、自分が何であり、どのように使用するかを知っている必要があります

ボックスの作成

stable Rustでは、 Box::new関数を使用してBox::newを作成します。

let boxed_int: Box<i32> = Box::new(1);

ボックス化された値の使用

BoxはDeref<Target=T>実装しているので、ボックス化された値はその値と同じように使用できます。

let boxed_vec = Box::new(vec![1, 2, 3]);
println!("{}", boxed_vec.get(0));

ボックス化された値に対してパターンマッチを行う場合は、手動でボックスの参照を解除する必要があります。

struct Point {
    x: i32,
    y: i32,
}

let boxed_point = Box::new(Point { x: 0, y: 0});
// Notice the *. That dereferences the boxed value into just the value
match *boxed_point {
    Point {x, y} => println!("Point is at ({}, {})", x, y),
}

ボックスを使用して再帰的列挙型と構造体を作成する

Boxを使わずにRustで再帰的列挙型を作成しようとすると、列挙型のサイズを変更できないというコンパイル時エラーが発生します。

// This gives an error!
enum List {
    Nil,
    Cons(i32, List)
}

列挙型が定義されたサイズを持つためには、再帰的に格納された値がBox内になければなりません。

// This works!
enum List {
    Nil,
    Cons(i32, Box<List>)
}

これは、TがどんなものであってもBoxが常に同じサイズを持つため、RustがListにサイズを与えることができるからです。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow