Ponteiros ou Referência
Para os ponteiros, uma distinção precisa de ser feita entre a desestruturação e a destruição de referência, uma vez que são conceitos diferentes que são usados de maneira diferente nas linguagens como C/C++.
- A destruição de referência usa
*
- A desestruturação usa
&
,ref
, eref mut
fn main() {// Atribuir uma referência do tipo `i32`. O `&` significa que// existe uma referência a ser atribuída.let reference = &4;match reference {// Se `reference` for o padrão correspondente contra `&val`,// resulta numa comparação como:// `&i32`// `&val`// ^ Nós vemos que se os `&` correspondentes forem eliminados,// então deve ser atribuído à `val`.&val => println!("Got a value via destructuring: {:?}", val),}// Para evitar o `&`, destruímos a referência antes da correspondência.match *reference {val => println!("Got a value via dereferencing: {:?}", val),}// E se não começarmos com uma referência? `reference` era um `&`// porque o lado direito já era uma referência. Isto não é uma// referência porque o lado direito não é uma.let _not_a_reference = 3;// A Rust fornece `ref` para exatamente este propósito. Ela modifica a// atribuição para que uma referência seja criada para o elemento;// esta referência é atribuída.let ref _is_a_reference = 3;// Assim, ao definir 2 valores sem referência, as referências podem// ser recuperadas através de `ref` e `ref mut`.let value = 5;let mut mut_value = 6;// Usar a palavra-chave `ref` para criar uma referênciamatch value {ref r => println!("Got a reference to a value: {:?}", r),}// Usar `ref mut` de maneira semelhante.match mut_value {ref mut m => {// Temos uma referência. Temos que destruir a sua referência// antes que possamos adicionar qualquer coisa à ela.*m += 10;println!("We added 10. `mut_value`: {:?}", m);},}}