这段代码有错误:
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
但是为什么?
是原始类型,即无论如何都应将其克隆。
我理解错了什么?
答案 0 :(得分:3)
这不起作用,因为您在进行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
关键字:取得所有权。