扩大生锈时间

wma*_*ees 11 lifetime rust

我有一些我正在与之抗争的代码.这是一个小辅助函数,它应该返回一个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
}
Run Code Online (Sandbox Code Playgroud)

编译器告诉我:error: 'out' does not live long enough并且引用必须在生命周期内有效'a,但它看起来像是为它定义的'a.

我也尝试将其更改为:

let out = &mut TokenList::<'a>::new();
Run Code Online (Sandbox Code Playgroud)

这不会改变任何错误消息.要么:

let out = &'a mut TokenList::<'a>::new();
Run Code Online (Sandbox Code Playgroud)

编译器完全不喜欢它.

如何定义out一生'a

有关更多详细信息,请参阅我对TokenList的定义:

pub type Token<'a> = &'a str;
pub type TokenList<'a> = Vec<Token<'a>>;
Run Code Online (Sandbox Code Playgroud)

aoc*_*via 11

生命周期out不是'a,因为out在功能结束时被破坏了.Rust不允许您返回对它的引用(它将允许访问释放的内存!).

尝试将您的功能更改为以下内容:

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
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以将所有权传递out给调用者,并且它将存活足够长的时间.