Это не работает, потому что вы захватываете 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
: завладеть.