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

How do I set the lifetime of a return value as the lifetime of the variable I move into it?

我正在尝试自学一些 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())

我认为错误是因为编译器无法推断我希望这个新创建的结构的生命周期是我要将其移入的变量的生命周期。这个对吗?我如何在这个 return value/fix 上注释生命周期?

I think the error is because there's no way for compiler to infer that I want the lifetime of this newly created struct to be the lifetime of the variable I want to move this into.

实际上,没有。

错误是因为您试图创建对变量 args 的引用,在您从 sys return 之后,该变量将不再有效,因为 args 是一个局部变量,因此在 sys.

的末尾被丢弃

如果您希望使用引用,您可以为 sys 提供一个 &'a mut Vec<String>(空),将其填入 sys,然后 return 对其进行引用:

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

这保证 argssys 调用更有效。这将在结果的生命周期内借用 args

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