capypad
0 Tage Serie
rust / intermediate
Snippet

Box<T> für Heap-Allokation und rekursive Typen

Box<T> alloziert Daten auf dem Heap statt auf dem Stack. Dies ist essentiell für rekursive Datenstrukturen wie Bäume und verkettete Listen, deren Größe zur Kompilierzeit nicht bekannt ist. Box<T> bietet Ownership-Semantik mit festen Zeigern.

snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
enum TreeNode<T> {
Leaf(T),
Branch {
value: T,
left: Box<TreeNode<T>>,
right: Box<TreeNode<T>>,
},
}
 
impl<T: std::fmt::Debug> TreeNode<T> {
fn new_leaf(value: T) -> Self {
TreeNode::Leaf(value)
}
fn new_branch(value: T, left: TreeNode<T>, right: TreeNode<T>) -> Self {
TreeNode::Branch {
value,
left: Box::new(left),
right: Box::new(right),
}
}
fn debug_print(&self, depth: usize) {
match self {
TreeNode::Leaf(v) => println!("{:width$}{:?}", "", v, width = depth * 2),
TreeNode::Branch { value, left, right } => {
println!("{:width$}{:?}", "", value, width = depth * 2);
left.debug_print(depth + 1);
right.debug_print(depth + 1);
}
}
}
}
Erklärung
1
left: Box<TreeNode<T>>
Box verpackt rekursiven Typ, bricht unendliche Größe zur Kompilierzeit auf
2
Box::new(left)
Konvertiert stack-allokierten TreeNode zu heap-allokiertem Box
3
left.debug_print(depth + 1)
Box dereferenziert automatisch für Methodenaufrufe
4
fn new_branch(value: T, left: TreeNode<T>, right: TreeNode<T>)
Akzeptiert owned TreeNodes, konvertiert zu Boxes innerhalb des Enums