Я знаю, что ссылка на Rust очень похожа на указатель C, и я все время думаю о ссылках на Rust как о указателях C. После некоторых экспериментов и поисков я запуталась.
Я знаком с C и читал В чем разница между размещением «mut» перед именем переменной и после «:»?, что дает следующую таблицу:
// Rust C/C++ a: &T == const T* const a; // can't mutate either mut a: &T == const T* a; // can't mutate what is pointed to a: &mut T == T* const a; // can't mutate pointer mut a: &mut T == T* a; // can mutate both
За сообщение проголосовали "за", поэтому я предполагаю, что он правильный.
Я написал следующий код на Rust
fn main() {
let mut x = 10;
let x1 = &mut x;
let x2 = &x1;
let x3 = &x2;
***x3 = 20;
}
в надежде, что он эквивалентен следующему коду C
int main() {
int x = 10;
int *const x1 = &x;
int *const *const x2 = &x1;
int *const *const *const x3 = &x2;
***x3 = 20;
return 0;
}
Код Rust не компилируется:
error[E0594]: cannot assign to `***x3` which is behind a `&` reference
--> src/main.rs:6:5
|
6 | ***x3 = 20;
| ^^^^^^^^^^ cannot assign
Что здесь не так?
Как ни странно, следующий код компилируется!
fn main() {
let mut x = 10;
let mut x1 = &mut x;
let mut x2 = &mut x1;
let mut x3 = &mut x2;
***x3 = 20;
}
Почему следует использовать let mut x1/2/3
вместо просто let x1/2/3
? Я думаю о let x1 = &mut x
как о постоянном указателе, указывающем на изменяемую переменную x
, но в Rust это не похоже. Это сообщение о переполнении стека неточно или я неправильно его понимаю?