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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow