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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow