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

2024-03-01

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

where 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())

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


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

事实上,没有。

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

如果您想使用参考文献,您可以提供sys with a &'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我无法建议如何最好地这样做。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐