Несмотря на то, что я внимательно прочитал документацию, я не совсем понимаю значение символов &
и *
в Rust и, в более общем плане, то, что именно является ссылкой на Rust.
В этом примере он похож на ссылку C ++ (то есть адрес, который автоматически разыменовывается при использовании):
fn main() {
let c: i32 = 5;
let rc = &c;
let next = rc + 1;
println!("{}", next); // 6
}
Однако следующий код работает точно так же:
fn main() {
let c: i32 = 5;
let rc = &c;
let next = *rc + 1;
println!("{}", next); // 6
}
Использование *
для разыменования ссылки было бы неправильным в C ++. Итак, я хотел бы понять, почему это правильно в Rust.
На данный момент я понимаю, что вставка *
перед ссылкой на Rust разыменовывает ее, но *
все равно вставляется неявно, поэтому вам не нужно его добавлять (в то время как в C ++ он неявно вставляется, и если вы вставите его, вы получите ошибка компиляции).
Однако что-то подобное не компилируется:
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`
Но это работает:
fn main() {
let mut c: i32 = 5;
let mut next: i32 = 0;
{
let rc = &mut c;
next = *rc + 1;
}
println!("{}", next); // 6
}
Кажется, что неявное разыменование (а-ля C ++) правильно для неизменяемых ссылок, но не для изменяемых ссылок. Почему это?