¿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.