Поиск…


Вступление

Коробки - очень важная часть ржавчины, и каждый расторопник должен знать, что это такое и как их использовать

Создание коробки

В стабильном Rust вы создаете Box, используя функцию Box::new .

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

Использование значений в штучной упаковке

Поскольку Boxes реализуют Deref<Target=T> , вы можете использовать значения в 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),
}

Использование ящиков для создания рекурсивных перечислений и структур

Если вы попытаетесь создать рекурсивное перечисление в Rust без использования Box, вы получите ошибку времени компиляции, указав, что перечисление не может быть задано.

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

Чтобы перечисление имело определенный размер, рекурсивно содержащее значение должно быть в поле.

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

Это работает, потому что Box всегда имеет тот же размер независимо от того, что такое T, что позволяет Rust давать список размером.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow