Примитивная переменная не живет достаточно долго - PullRequest
0 голосов
/ 30 октября 2018

В этом фрагменте кода есть ошибка:

let a: Vec<_> = (1..10).flat_map(|x| (1..x).map(|_| x)).collect();

Сообщение об ошибке:

error[E0597]: `x` does not live long enough
 --> src/main.rs:2:57
  |
2 |     let a: Vec<_> = (1..10).flat_map(|x| (1..x).map(|_| x)).collect();
  |                                                     --- ^-          - borrowed value needs to live until here
  |                                                     |   ||
  |                                                     |   |borrowed value only lives until here
  |                                                     |   borrowed value does not live long enough
  |                                                     capture occurs here

Но почему?

Это примитивный тип, т. Е. Его все равно следует клонировать.

Что я не так понимаю?

1 Ответ

0 голосов
/ 30 октября 2018

Это не работает, потому что вы захватываете x по ссылке, когда вы делаете map(|_| x). x не является локальной переменной для замыкания, поэтому она заимствована. Чтобы не занимать x, необходимо использовать ключевое слово move:

let a: Vec<_> = (1..10).flat_map(|x| (1..x).map(move |_| x)).collect();

Но это более идиоматично, чтобы написать (для того же вывода):

use std::iter::repeat;
let b: Vec<_> = (2..10).flat_map(|x| repeat(x).take(x - 1)).collect();

Относительно вопроса «почему»: некоторые люди могут захотеть заимствовать копируемые данные, поэтому правила захвата те же:

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