原始变量的寿命不足

时间:2018-10-30 13:02:26

标签: rust iterator closures

这段代码有错误:

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 :(得分: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关键字:取得所有权。