问题 扩大生锈时间


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

13112
2017-07-06 18:15


起源

简而言之,生命只描述某事物的存在时间,从不影响其存在的时间。
太糟糕了。这将是一个很好的功能。谢谢! - wmaxlees


答案:


一生的 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 给来电者,它会活得足够长。


11
2017-07-06 18:26



啊,我感到愚蠢。出于某种原因,我在考虑 &str 就像字符串和包装一样,即使是 & 清楚地表明它是一个参考。现在我已经进行了修正,很明显我需要重新定义并重新定义我的初始数据类型并通过我的代码传播该更改。谢谢! - wmaxlees
没问题!我觉得感觉愚蠢是学习的明显效果:P ...尤其是在学习Rust时! - aochagavia