Rust
Valori in scatola
Ricerca…
introduzione
Le scatole sono una parte molto importante di Rust e ogni rustacean dovrebbe sapere cosa sono e come usarli
Creare una scatola
In Rust stabile crei una casella usando la funzione Box::new
.
let boxed_int: Box<i32> = Box::new(1);
Utilizzo di valori inscatolati
Poiché le scatole implementano il Deref<Target=T>
, puoi usare valori in box proprio come il valore che contengono.
let boxed_vec = Box::new(vec![1, 2, 3]);
println!("{}", boxed_vec.get(0));
Se si desidera eseguire lo schema di corrispondenza su un valore di riquadri, potrebbe essere necessario rimuovere manualmente la casella.
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),
}
Usare le scatole per creare enum e strutture ricorsive
Se provi a creare un enum ricorsivo in Rust senza usare Box, riceverai un errore di compilazione che dice che l'enum non può essere ridimensionato.
// This gives an error!
enum List {
Nil,
Cons(i32, List)
}
Affinché l'enum abbia una dimensione definita, il valore contenuto in modo ricorsivo deve essere in una casella.
// This works!
enum List {
Nil,
Cons(i32, Box<List>)
}
Questo funziona perché Box ha sempre le stesse dimensioni indipendentemente da cosa sia T, il che consente a Rust di dare una dimensione all'Elenco.