Recherche…


Introduction

Les boîtes sont une partie très importante de Rust, et chaque paysan doit savoir ce qu’il est et comment l’utiliser.

Créer une boîte

Dans Rust stable, vous créez une Box en utilisant la fonction Box::new .

let boxed_int: Box<i32> = Box::new(1);

Utiliser les valeurs en boîte

Comme les boîtes implémentent le Deref<Target=T> , vous pouvez utiliser des valeurs encadrées comme la valeur qu'elles contiennent.

let boxed_vec = Box::new(vec![1, 2, 3]);
println!("{}", boxed_vec.get(0));

Si vous souhaitez créer un motif sur une valeur encadrée, vous devrez peut-être déréférencer la boîte manuellement.

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),
}

Utiliser des boîtes pour créer des énumérations et des structures récursives

Si vous essayez de créer une énumération récursive dans Rust sans utiliser Box, vous obtiendrez une erreur de compilation indiquant que l'énumération ne peut pas être dimensionnée.

// This gives an error!
enum List {
    Nil,
    Cons(i32, List)
}

Pour que l'énum ait une taille définie, la valeur contenue dans la récursivité doit être dans une boîte.

// This works!
enum List {
    Nil,
    Cons(i32, Box<List>)
}

Cela fonctionne parce que Box a toujours la même taille quel que soit T, ce qui permet à Rust de donner une taille à List.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow