Nonostante la lettura completa della documentazione, sono piuttosto confuso sul significato del simbolo &
e *
in Rust e, più in generale, su ciò che è un riferimento di Rust Esattamente.Significato dei simboli "e" e "stella" * in Rust
In questo esempio, sembra essere simile a un riferimento C++ (cioè, un indirizzo che viene dereferenziato automaticamente se utilizzati):
fn main() {
let c: i32 = 5;
let rc = &c;
let next = rc + 1;
println!("{}", next); // 6
}
Tuttavia, il seguente codice funziona esattamente lo stesso:
Utilizzare *
per risolvere un riferimento non sarebbe corretto in C++. Quindi mi piacerebbe capire perché questo è corretto in Rust.
mia comprensione finora, è che, inserendo *
di fronte a un riferimento dereferenziazioni Rust, ma il *
è implicitamente inserito comunque in modo non c'è bisogno di aggiungere che (mentre in C++, è implicitamente inserito e se si inseriscilo si ottiene un errore di compilazione).
Tuttavia, una cosa del genere non può essere compilato:
fn main() {
let mut c: i32 = 5;
let mut next: i32 = 0;
{
let rc = &mut c;
next = rc + 1;
}
println!("{}", next);
}
<anon>:6:16: 6:18 error: binary operation `+` cannot be applied to type `&mut i32` [E0369]
<anon>:6 next = rc + 1;
^~
<anon>:6:16: 6:18 help: see the detailed explanation for E0369
<anon>:6:16: 6:18 note: an implementation of `std::ops::Add` might be missing for `&mut i32`
<anon>:6 next = rc + 1;
Ma questo funziona:
fn main() {
let mut c: i32 = 5;
let mut next: i32 = 0;
{
let rc = &mut c;
next = *rc + 1;
}
println!("{}", next); // 6
}
Sembra che dereferenziazione implicita (a la C++) è corretta per i riferimenti immutabili , ma non per riferimenti mutevoli. Perchè è questo?
Grazie, capisco ora. In realtà, avevo pensato che potesse essere qualcosa del genere ma avevo respinto il pensiero, pensando che sarebbe stato molto strano definire la somma di un intero con un indirizzo di un intero come quello. Forse dovrebbe essere sottolineato nel documento che i riferimenti di Rust devono essere pensati come indirizzi e non essere confusi con i riferimenti C++. Grazie ancora per la spiegazione dettagliata. –