如何将返回值的生命周期设置为我移入其中的变量的生命周期?

时间:2015-02-23 10:59:12

标签: rust

我正在努力教自己一些生锈,并写了一些看起来像:

let args:Vec<String> = env::args().collect();
let parsed = parser::sys(args.as_slice());

...

pub fn sys<'a>(args:&'a [String]) -> Parsed<'a> {
  parsed(args)
}

其中parsed是一个解析和加载配置的函数。

这很好用。现在我试图抽象地明确调用env::args()并在调用sys时隐藏它,所以我写了sys的新版本

pub fn sys<'a>() -> Parsed<'a> {
  let args:Vec<String> = env::args().collect();
  parsed(args.as_slice())
}

这失败了:

error: `args` does not live long enough
src/test.rs:66      parsed(args.as_slice())

我认为错误是因为编译器无法推断我希望这个新创建的结构的生命周期是我想要将其移入的变量的生命周期。它是否正确?如何在此返回值上注释生命周期/修复此问题?

1 个答案:

答案 0 :(得分:3)

  

我认为错误是因为编译器无法推断我希望这个新创建的结构的生命周期是我想要将其移入的变量的生命周期。

实际上,没有。

错误是因为您尝试创建对变量args的引用,从sys返回后它将不再有效,因为args是一个局部变量,因此被删除在sys的末尾。

如果您希望使用引用,可以向sys提供&'a mut Vec<String>(空),将其填入sys,并返回对它的引用:

pub fn sys<'a>(args: &'a mut Vec<String>) -> Parsed<'a> {
    *args = env::args().collect();
    parsed(args.as_slice())
}

保证argssys电话更长。这将在结果的生命周期内借用args

另一个解决方案是取消'a并让Parsed拥有其元素而不是引用它们;但是如果没有Parsed的定义,我无法建议如何最好地做到这一点。