如何将 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())
}
这保证 args
比 sys
调用更有效。这将在结果的生命周期内借用 args
。
另一个解决方案是取消 'a
并简单地让 Parsed
拥有它的元素而不是引用它们;然而,如果没有 Parsed
的定义,我无法建议如何最好地做到这一点。
我正在尝试自学一些 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())
}
这保证 args
比 sys
调用更有效。这将在结果的生命周期内借用 args
。
另一个解决方案是取消 'a
并简单地让 Parsed
拥有它的元素而不是引用它们;然而,如果没有 Parsed
的定义,我无法建议如何最好地做到这一点。