Entendiendo Box, ref, & y * en Rust: ¿cuál es la diferencia y cómo usarlos?
¡Hola a todos! Empecé a estudiar Rust recientemente y siempre me confundo con estas cuatro cosas: `Box`, `ref`, `&` y `*`. Entiendo que todas están relacionadas de alguna manera con punteros y referencias, pero no logro captar cuándo aplicar cada una.
Por ejemplo, escribo este programa:
```rust
fn main() {
let x = 42;
let y = &x; // referencia
let z = Box::new(x); // Box
println!("{} {}", y, z);
}
```
Aquí todo funciona. Pero cuando intento hacer algo más complejo, como el pattern matching, todo se rompe:
```rust
fn main() {
let maybe_number = Some(10);
match maybe_number {
Some(ref x) => println!("Obtuvimos {}", x),
None => println!("No hay nada"),
}
}
```
¿Por qué aquí se necesita `ref` y no simplemente `x`? ¿Y en qué se diferencia `*` de `&`? He leído que `*` es la desreferencia, pero ¿para qué sirve si puedo usar simplemente `&`?
Explíquenme, por favor, de manera sencilla cómo se relacionan estas cuatro entidades y cuándo aplicar cada una. Me interesa especialmente la práctica.