我正在努力教自己一些生锈,并写了一些看起来像:
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())
我认为错误是因为编译器无法推断我希望这个新创建的结构的生命周期是我想要将其移入的变量的生命周期。它是否正确?如何在此返回值上注释生命周期/修复此问题?
答案 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())
}
保证args
比sys
电话更长。这将在结果的生命周期内借用args
。
另一个解决方案是取消'a
并让Parsed
拥有其元素而不是引用它们;但是如果没有Parsed
的定义,我无法建议如何最好地做到这一点。