Significado dos símbolos "e" e "e" estrela "*" em Rust
Apesar de ler atentamente a documentação, estou um pouco confuso sobre o significado do&
e*
símbolo no Rust e, mais geralmente, sobre o que é exatamente uma referência ao Rust.
Neste exemplo, parece ser semelhante a uma referência C ++ (ou seja, um endereço que é automaticamente desreferenciado quando usado):
fn main() {
let c: i32 = 5;
let rc = &c;
let next = rc + 1;
println!("{}", next); // 6
}
No entanto, o código a seguir funciona exatamente da mesma maneira:
fn main() {
let c: i32 = 5;
let rc = &c;
let next = *rc + 1;
println!("{}", next); // 6
}
Usando*
desreferenciar uma referência não estaria correta em C ++. Então, eu gostaria de entender por que isso está correto no Rust.
Meu entendimento até agora é que, inserindo*
na frente de uma referência Rust a desreferencia, mas o*
é inserido implicitamente de qualquer maneira, para que você não precise adicioná-lo (enquanto em C ++, ele é inserido implicitamente e, se você o inserir, receberá um erro de compilação).
No entanto, algo assim não compila:
fn main() {
let mut c: i32 = 5;
let mut next: i32 = 0;
{
let rc = &mut c;
next = rc + 1;
}
println!("{}", next);
}
error[E0369]: binary operation `+` cannot be applied to type `&mut i32`
--> src/main.rs:6:16
|
6 | next = rc + 1;
| ^^^^^^
|
= note: this is a reference to a type that `+` can be applied to; you need to dereference this variable once for this operation to work
= note: an implementation of `std::ops::Add` might be missing for `&mut i32`
Mas isso funciona:
fn main() {
let mut c: i32 = 5;
let mut next: i32 = 0;
{
let rc = &mut c;
next = *rc + 1;
}
println!("{}", next); // 6
}
Parece que a desreferenciação implícita (à la C ++) está correta para referências imutáveis, mas não para referências mutáveis. Por que é isso?