扩展 Rust 生命周期
Expanding Rust Lifetime
我有一些代码正在处理。这是一个小辅助函数,应该 return 一个 Vec<&str>
到调用函数。不过,我似乎无法获得正确的生命周期。
这是代码片段:
fn take_symbol<'a>(ch: &'a str, current: &'a mut String) -> &'a mut TokenList<'a> {
let out = TokenList::<'a>::new();
out.push(current.as_str());
out.push(ch);
*current = String::new();
&mut out
}
编译器告诉我:error: 'out' does not live long enough
并且引用必须在 'a
的生命周期内有效,但在我看来它是为 'a
定义的。
我也试过改成:
let out = &mut TokenList::<'a>::new();
这不会更改任何错误消息。或者:
let out = &'a mut TokenList::<'a>::new();
编译器根本不喜欢。
如何定义 out
的生命周期为 'a
?
有关详细信息,这是我对 TokenList 的定义:
pub type Token<'a> = &'a str;
pub type TokenList<'a> = Vec<Token<'a>>;
out
的生命周期不是 'a
,因为 out
在函数结束时被销毁。 Rust 不允许您 return 对它的引用(它将允许访问释放的内存!)。
尝试将函数更改为以下内容:
fn take_symbol<'a>(ch: &'a str, current: &'a mut String) -> TokenList<'a> {
let out = TokenList::<'a>::new();
out.push(current.as_str());
out.push(ch);
*current = String::new();
out
}
这样您就可以将 out
的所有权传递给调用者并且它会存在足够长的时间。
我有一些代码正在处理。这是一个小辅助函数,应该 return 一个 Vec<&str>
到调用函数。不过,我似乎无法获得正确的生命周期。
这是代码片段:
fn take_symbol<'a>(ch: &'a str, current: &'a mut String) -> &'a mut TokenList<'a> {
let out = TokenList::<'a>::new();
out.push(current.as_str());
out.push(ch);
*current = String::new();
&mut out
}
编译器告诉我:error: 'out' does not live long enough
并且引用必须在 'a
的生命周期内有效,但在我看来它是为 'a
定义的。
我也试过改成:
let out = &mut TokenList::<'a>::new();
这不会更改任何错误消息。或者:
let out = &'a mut TokenList::<'a>::new();
编译器根本不喜欢。
如何定义 out
的生命周期为 'a
?
有关详细信息,这是我对 TokenList 的定义:
pub type Token<'a> = &'a str;
pub type TokenList<'a> = Vec<Token<'a>>;
out
的生命周期不是 'a
,因为 out
在函数结束时被销毁。 Rust 不允许您 return 对它的引用(它将允许访问释放的内存!)。
尝试将函数更改为以下内容:
fn take_symbol<'a>(ch: &'a str, current: &'a mut String) -> TokenList<'a> {
let out = TokenList::<'a>::new();
out.push(current.as_str());
out.push(ch);
*current = String::new();
out
}
这样您就可以将 out
的所有权传递给调用者并且它会存在足够长的时间。