Box
com Estruturas de Dados Recursivas
Tipos de dados recursivos ou tipos de dados com tamanhos dinâmicos precisam usar uma Box
:
#[derive(Debug)] enum List<T> { Cons(T, Box<List<T>>), Nil, } fn main() { let list: List<i32> = List::Cons(1, Box::new(List::Cons(2, Box::new(List::Nil)))); println!("{list:?}"); }
-
Se a
Box
não for usada e tentarmos incorporar umaList
diretamente naList
, o compilador não conseguiria calcular um tamanho fixo da struct na memória (List
teria tamanho infinito) . -
Box
resolve esse problema, pois tem o mesmo tamanho de um ponteiro normal e apenas aponta para o próximo elemento daList
no heap. -
Remova o
Box
na definição deList
e mostre o erro de compilação. “Recursive with indirection” (recursivo com indireção) é uma dica para que você talvez queira usar umaBox
ou referência de alguma forma, ao invés de armazenar um valor diretamente.