我正在尝试教自己一些生锈的知识,并写了一些类似的内容:
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())
我认为该错误是因为编译器无法推断出我希望此新创建的结构的生存期是要移入其中的变量的生存期。这样对吗?如何在此返回值上标注生命周期/解决此问题?
我认为该错误是因为编译器无法推断出我希望此新创建的结构的生存期是要移入其中的变量的生存期。
其实没有
错误的原因是您尝试在变量中创建引用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
我无法建议如何做到最好。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句