扩展Rust生命周期

14

我有一段代码,一直在与之斗争。这是一个小助手函数,应该向调用函数返回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>>;

4
简而言之,寿命只描述某物生存多久,不会影响它的寿命。 - user395760
太遗憾了。那将是一个不错的功能。谢谢! - wmaxlees
1个回答

13

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 的所有权转移给调用者,并且它将存活足够长的时间。


啊,我感觉自己很蠢。由于&明确表示它是一个引用,但出于某种原因,我一直将&str视为类似于字符串和包装器的东西。现在我已经接受了你的更正,很清楚我需要回过头重新定义我的初始数据类型,并通过我的代码传播这个变化。谢谢! - wmaxlees
1
没问题!我猜感觉愚蠢是学习的明显影响 :P ... 尤其是学习 Rust! - aochagavia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接