Avatar ·

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.