【问题标题】:Primitive variable does not live long enough原始变量的寿命不够长
【发布时间】:2019-04-03 12:45:25
【问题描述】:

这段代码有错误:

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

但是为什么呢?

Is 是原始类型,即无论如何都应该克隆它。

我理解错了什么?

【问题讨论】:

  • 我不知道这是否是你真正的用例,但1..10 已经是一个迭代器。你可以写:let a: Vec&lt;_&gt; = (1..10).flat_map(|x| 1..x).collect().
  • @Boiethios 当然,我知道,但在这种情况下,这只是一个例子
  • 反正我一开始没看懂你的代码:P
  • @Boiethios 最初我生成了元组|y| (x,y)
  • 哦,那你可以用Itertools::tuple_combinations

标签: rust iterator closures


【解决方案1】:

这不起作用,因为您在执行map(|_| x) 时通过引用捕获了xx 不是闭包的局部变量,所以是借用的。要不借用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 关键字:取得所有权。

【讨论】:

  • @IgorChubin 不太明白 - 你在评论什么?您是否看过答案的先前编辑?我想我应该清理过时的 cmets。
猜你喜欢
  • 1970-01-01
  • 2016-01-22
  • 2016-03-31
  • 2015-05-26
  • 1970-01-01
  • 2017-10-16
  • 2015-12-05
  • 2020-12-17
  • 1970-01-01
相关资源
最近更新 更多