Avatar ·

¿Qué es un "fat pointer" (puntero graso) en Rust y en qué se diferencia de uno normal?

¡Hola, colegas! Empecé a estudiar Rust y me topé con el término "fat pointer" (puntero graso). En los libros escriben que es "un puntero con metainformación adicional", pero no logro entender para qué sirve y dónde se usa. Sé que en Rust hay referencias normales `&T` que simplemente apuntan a datos. Pero, por ejemplo, los slices. Escribí este código: ```rust fn main() { let arr = [1, 2, 3, 4, 5]; let slice: &[i32] = &arr[1..4]; println!("Longitud del slice: {}", slice.len()); // Imprime 3 } ``` No entiendo: ¿cómo sabe Rust que la longitud del slice es 3, si solo paso una referencia al primer elemento? Un puntero normal en C/C++ solo almacena la dirección, y la longitud hay que pasarla por separado. ¿Resulta que `&[i32]` no es solo una dirección? También escuché sobre trait objects, como `Box`. Dicen que también son fat pointers. Pero, ¿en qué consiste su "grasa"? Porque un `Box` normal es solo un puntero al heap. ¿Qué tiene de especial `Box`? Explíquenme, por favor.