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:?}");
}
PilhaHeaplistaCons1Cons2Nil
  • Se a Box não for usada e tentarmos incorporar uma List diretamente na List, 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 da List no heap.

  • Remova o Box na definição de List e mostre o erro de compilação. “Recursive with indirection” (recursivo com indireção) é uma dica para que você talvez queira usar uma Box ou referência de alguma forma, ao invés de armazenar um valor diretamente.