Значение символов амперсанда '&' и звездочки '*' в Rust
Несмотря на тщательное чтение документации, я не совсем понимаю смысл&
а также*
символ в 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 ++) является правильным для неизменяемых ссылок, но не для изменяемых ссылок. Почему это?