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 lista: List<i32> = List::Cons(1, Box::new(List::Cons(2, Box::new(List::Nil)))); println!("{lista:?}"); }
-
Se a
Boxnão for usada e tentarmos incorporar umaListdiretamente naList, o compilador não conseguiria calcular um tamanho fixo da struct na memória (Listteria tamanho infinito) . -
Boxresolve esse problema, pois tem o mesmo tamanho de um ponteiro normal e apenas aponta para o próximo elemento daListno heap. -
Remova o
Boxna definição deListe mostre o erro de compilação. “Recursive with indirection” (recursivo com indireção) é uma dica para que você talvez queira usar umaBoxou referência de alguma forma, ao invés de armazenar um valor diretamente.