Понимание разыменования с использованием '*' в ржавчине - PullRequest
0 голосов
/ 25 сентября 2018
struct Abc {
    a: i32,
}

fn main() {
    let mut abc = Abc { a: 30 };
    let xyz = &abc;
    let q = *xyz;
}

Компиляция кода выдает следующую ошибку:

error[E0507]: cannot move out of borrowed content
  --> src/main.rs:11:13
   |
11 |     let q = *xyz;
   |             ^^^^
   |             |
   |             cannot move out of borrowed content
   |             help: consider using a reference instead: `&*xyz`

Пожалуйста, помогите мне понять, что здесь происходит не так.

1 Ответ

0 голосов
/ 26 сентября 2018

Когда вы пишете let a = b; в Rust, значение b равно , перемещено в a, и переменная b больше не может использоваться.

В вашемcase, xyz является ссылкой на abc, поэтому *xyz - это то же самое, что и abc.Перемещение abc является ошибкой, поскольку ссылка xyz все еще существует, но теперь указывает на недопустимую память.

Если вы не уверены, почему этого не произошло с числовым типом, таким как i32, этопотому что большинство простых примитивов реализуют черту Copy.Это признак маркера, который указывает компилятору копировать значение в памяти, а не перемещать его.Для небольших типов это может быть та же производительность, что и (а иногда даже лучше) при передаче по ссылке.

См .:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...