Rust
Вставные значения
Поиск…
Вступление
Коробки - очень важная часть ржавчины, и каждый расторопник должен знать, что это такое и как их использовать
Создание коробки
В стабильном 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 давать список размером.