扩大生锈时间

时间:2015-07-06 18:15:57

标签: rust lifetime

我有一些我正在与之抗争的代码。这是一个小辅助函数,应该将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>>;

1 个答案:

答案 0 :(得分: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
}

通过这种方式,您可以将out的所有权传递给来电者,并且它会活得足够长。