ReferĂȘncias Compartilhadas

Uma referĂȘncia fornece uma maneira de acessar outro valor sem assumir a responsabilidade pelo valor, e tambĂ©m Ă© chamada de "emprĂ©stimo". ReferĂȘncias compartilhadas sĂŁo somente leitura e os dados referenciados nĂŁo podem ser alterados.

fn main() {
    let a = 'A';
    let b = 'B';
    let mut r: &char = &a;
    println!("r: {}", *r);
    r = &b;
    println!("r: {}", *r);
}

Uma referĂȘncia compartilhada a um tipo T tem tipo &T. Um valor de referĂȘncia Ă© feito com o operador &. O operador * "desreferencia" uma referĂȘncia, produzindo seu valor.

Rust estaticamente proibirĂĄ referĂȘncias pendentes:

fn x_axis(x: &i32) -> &(i32, i32) {
    let point = (*x, 0);
    return &point;
}
This slide should take about 10 minutes.
  • Uma referĂȘncia Ă© dita que "borrow" (empresta) o valor a que se refere, e este Ă© um bom modelo para estudantes nĂŁo familiarizados com ponteiros: o cĂłdigo pode usar a referĂȘncia para acessar o valor, mas ainda Ă© "owned" (propriedade) da variĂĄvel original. O curso entrarĂĄ em mais detalhes sobre ownership no dia 3.

  • ReferĂȘncias sĂŁo implementadas como ponteiros, e uma vantagem chave Ă© que podem ser muito menores do que a coisa a que apontam. Os alunos familiarizados com C ou C++ reconhecerĂŁo referĂȘncias como ponteiros. Partes posteriores do curso abordarĂŁo como o Rust impede os bugs de segurança de memĂłria que vĂȘm do uso de ponteiros brutos.

  • O Rust nĂŁo cria automaticamente referĂȘncias para vocĂȘ - o & Ă© sempre necessĂĄrio.

  • Em alguns casos, o Rust desreferenciarĂĄ automaticamente, em particular ao invocar mĂ©todos (tente r.is_ascii()). NĂŁo hĂĄ necessidade de um operador -> como em C++.

  • Neste exemplo, r Ă© mutĂĄvel para que possa ser reatribuĂ­do (r = &b). Observe que isso re-associa r, de modo que se refere a outra coisa. Isso Ă© diferente do C++, onde a atribuição a uma referĂȘncia altera o valor referenciado.

  • Uma referĂȘncia compartilhada nĂŁo permite modificar o valor a que se refere, mesmo que esse valor seja mutĂĄvel. Tente *r = 'X'.

  • O Rust estĂĄ rastreando os tempos de vida de todas as referĂȘncias para garantir que elas vivam tempo suficiente. ReferĂȘncias pendentes nĂŁo podem ocorrer em Rust seguro. x_axis retornaria uma referĂȘncia a point, mas point serĂĄ desalocado quando a função retornar, entĂŁo isso nĂŁo serĂĄ compilado.

  • Falaremos mais sobre emprĂ©stimos quando chegarmos Ă  ownership.