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; }
-
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-associar
, 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 apoint
, maspoint
serå desalocado quando a função retornar, então isso não serå compilado. -
Falaremos mais sobre empréstimos quando chegarmos à ownership.