Rust
Boxade värden
Sök…
Introduktion
Lådor är en mycket viktig del av Rust, och varje skaldjur bör veta vad de är och hur man använder dem
Skapa en låda
I stabil rost skapar du en ruta med funktionen Box::new
.
let boxed_int: Box<i32> = Box::new(1);
Använda boxade värden
Eftersom rutor implementerar Deref<Target=T>
, kan du använda boxade värden precis som det värde de innehåller.
let boxed_vec = Box::new(vec![1, 2, 3]);
println!("{}", boxed_vec.get(0));
Om du vill mönstra matchning på ett boxat värde, kan du behöva ta bort rutan manuellt.
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),
}
Använda rutor för att skapa rekursiva enums och strukturer
Om du försöker skapa ett rekursivt enum i Rust utan att använda rutan, får du ett sammanställningstidsfel som säger att enum inte kan dimensioneras.
// This gives an error!
enum List {
Nil,
Cons(i32, List)
}
För att enum ska ha en definierad storlek måste det rekursivt innehållande värdet ligga i en ruta.
// This works!
enum List {
Nil,
Cons(i32, Box<List>)
}
Detta fungerar eftersom Box alltid har samma storlek oavsett vad T är, vilket gör att Rust kan ge Listan en storlek.
Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow