O que é um "fat pointer" (ponteiro gordo) em Rust e para que serve?
Olá, colegas! Comecei a estudar Rust recentemente e me deparei com o termo "fat pointer" (ponteiro gordo). Na documentação oficial e nos fóruns, essa palavra aparece, mas as definições são vagas.
Eu entendo que em Rust existem ponteiros comuns (por exemplo, `*const T` ou referências `&T`), que simplesmente armazenam um endereço na memória. Mas o que é um ponteiro "gordo"? Como ele difere de um ponteiro comum? Ouvi dizer que está relacionado a traits (`dyn Trait`) e slices (`&[u8]`).
Por exemplo, quando escrevo:
```rust
let slice: &[i32] = &[1, 2, 3];
```
Eu sei que `slice` é uma referência para um array. Mas dizem que isso é um fat pointer. Por quê? Afinal, é apenas uma referência, não é? Ou quando uso um trait object:
```rust
fn print_debug(item: &dyn Debug) {
println!("{:?}", item);
}
```
Aqui, `item` também é um fat pointer? Quanta memória ele ocupa? E como o Rust sabe qual método chamar, se o tipo é conhecido apenas em tempo de execução?
Expliquem, por favor, de forma simples, com exemplos. Acho que perdi algo.