Entendendo Box, ref, & e * em Rust: qual a diferença e como usá-los?
Olá a todos! Comecei a estudar Rust recentemente e sempre me confundo com essas quatro coisas: `Box`, `ref`, `&` e `*`. Entendo que todas estão de alguma forma relacionadas a ponteiros e referências, mas não consigo entender quando usar cada uma.
Por exemplo, escrevo este programa:
```rust
fn main() {
let x = 42;
let y = &x; // referência
let z = Box::new(x); // Box
println!("{} {}", y, z);
}
```
Isso funciona. Mas quando tento fazer algo mais complexo, como pattern matching, tudo quebra:
```rust
fn main() {
let maybe_number = Some(10);
match maybe_number {
Some(ref x) => println!("Obtivemos {}", x),
None => println!("Nada aqui"),
}
}
```
Por que aqui precisa de `ref`, e não apenas `x`? E como `*` difere de `&`? Li que `*` é desreferenciamento, mas para que serve se posso simplesmente usar `&`?
Expliquem, por favor, de forma simples como essas quatro entidades se relacionam e quando usar cada uma. Estou especialmente interessado na prática.