Avatar ·

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.