Скрытое заимствование в Rust - PullRequest
0 голосов
/ 02 марта 2019

Ниже приведен фрагмент кода ( детская площадка ), который я пытался запустить:

fn main() {
    let a = vec!["hello".to_string(), "world".to_string()];
    let b = vec![10, 20, 30];

    let c = a[0];
    let d = b[0];

    println!("{:?}", c);
    println!("{:?}", d);
}

Ошибка говорит о том, что «значения не могут быть перемещены из заимствованного содержимого»:

error[E0507]: cannot move out of borrowed content
 --> src/main.rs:5:13
  |
5 |     let c = a[0];
  |             ^^^^
  |             |
  |             cannot move out of borrowed content
  |             help: consider borrowing here: `&a[0]`

Но я не вижу никаких явных заимствований.Где именно осуществляется заимствование?А что одолжено?И что такое заимствованный контент, упомянутый в ошибке?

Этого не происходит с примитивными типами, такими как float, chars и т. Д. Может быть, потому что значения копируются, а не перемещаются, что возможнотолько в случае примитивов (структур данных, значения которых полностью хранятся в стеке, а не в куче).

1 Ответ

0 голосов
/ 02 марта 2019

Назначения перемещают значения в этом случае.По сути, let stuff = a[0] пытается переместить значение в 0-й индекс вектора a, что оставляет этот индекс каким-то образом неопределенным, что недопустимо в Rust.Выражение a[0] заимствует значение в нулевом индексе, потому что это синтаксический сахар для *a.index(0), где index возвращает заимствованное значение .

Это обсуждается в книге Rust ив Rust на примере более подробно.

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