Rust
Wartości w ramkach
Szukaj…
Wprowadzenie
Pudełka są bardzo ważną częścią Rdzy i każdy szelak powinien wiedzieć, czym jest i jak z nich korzystać
Tworzenie pudełka
W stabilnej Rust tworzysz Box używając funkcji Box::new
.
let boxed_int: Box<i32> = Box::new(1);
Używanie wartości pudełkowych
Ponieważ skrzynki implementują Deref<Target=T>
, możesz używać wartości w ramkach dokładnie tak, jak zawierają je wartości.
let boxed_vec = Box::new(vec![1, 2, 3]);
println!("{}", boxed_vec.get(0));
Jeśli chcesz dopasować wzór do wartości w ramce, być może będziesz musiał ręcznie wyrejestrować pole.
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),
}
Używanie skrzynek do tworzenia rekurencyjnych wyliczeń i struktur
Jeśli spróbujesz utworzyć wyliczenie rekurencyjne w Rust bez użycia Boxa, pojawi się błąd czasu kompilacji informujący, że wyliczenia nie można ustalić.
// This gives an error!
enum List {
Nil,
Cons(i32, List)
}
Aby wyliczenie miało określony rozmiar, rekursywnie zawarta wartość musi znajdować się w ramce.
// This works!
enum List {
Nil,
Cons(i32, Box<List>)
}
Działa to, ponieważ Box zawsze ma ten sam rozmiar bez względu na T, co pozwala Rustowi nadać Listowi rozmiar.