Box con Estructuras de Datos Recursivos

Los tipos de datos recursivos o los tipos de datos con tamaños dinámicos deben utilizar un 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:?}");
}
StackHeaplistCons1Cons2Nil
  • Si no se utiliza Box e intentamos insertar un List directamente dentro de List, el compilador no calcularía un tamaño fijo de la estructura en la memoria (List tendría un tamaño infinito).

  • Box resuelve este problema, ya que tiene el mismo tamaño que un puntero normal y solo apunta al siguiente elemento de la List en el heap.

  • Elimina Box de la definición de la lista y muestra el error del compilador. “Recursivo con indirección” es una sugerencia de que puedes usar un Box o referencia de algún tipo, en lugar de almacenar un valor directamente.